built on 26/08/2023 10:27:15
669
doclib/LICENSE.txt
Normal file
@ -0,0 +1,669 @@
|
||||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU Affero General Public License from time to time. Such new versions
|
||||
will be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU Affero General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
A library to generate ingame manuals based on markdown files.
|
||||
Copyright (C) 2023 Joachim Stolberg
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
==============================================================================
|
||||
|
||||
Joachim Stolberg, CC BY-SA 3.0:
|
||||
|
||||
* doclib_book.png
|
||||
* doclib_book_inv.png
|
||||
* doclib_demo_img*.png
|
118
doclib/README.md
Normal file
@ -0,0 +1,118 @@
|
||||
DocLib [doclib]
|
||||
===============
|
||||
|
||||
**A library to generate ingame manuals based on markdown files.**
|
||||
|
||||
Browse on: [GitHub](https://github.com/joe7575/doclib)
|
||||
|
||||
Download: [GitHub](https://github.com/joe7575/doclib/archive/main.zip)
|
||||
|
||||
![DocLib](https://github.com/joe7575/doclib/blob/main/screenshot.png)
|
||||
|
||||
|
||||
### Introduction
|
||||
|
||||
DocLib is used to generate a manual as ingame documentation.
|
||||
The manual content is generated based on markdown files.
|
||||
|
||||
An advantage of this solution is the dual use of the documentation:
|
||||
|
||||
- A markdown file as web solution e. g. on GitHub
|
||||
- A book as ingame manual
|
||||
|
||||
To generate a manual for your mod:
|
||||
|
||||
- Create your documentation as markdown file
|
||||
- Copy the python script `markdown_to_lua.py` to your mod folder
|
||||
- Add your markdown file to the python script (the last few lines)
|
||||
- Install mistune with `pip install mistune==0.8.4`
|
||||
- Run the script with `python markdown_to_lua.py`
|
||||
- Implement the book node according to `node.lua`
|
||||
|
||||
|
||||
### Supported Markdown Markups
|
||||
|
||||
- Heading
|
||||
- List
|
||||
- Code block
|
||||
|
||||
In addition DocLib supports image links for the ingame manual:
|
||||
|
||||
- for node images: `[doclib:manual|image]`
|
||||
- for PNG images: `[doclib_book_inv.png|image]`
|
||||
|
||||
See examples in `manual_EN.md`.
|
||||
|
||||
|
||||
### Construction Plans
|
||||
|
||||
This is a feature, mainly used by the mod techage to show construction plans of
|
||||
multi-block machines. But it can be used for any other mod, too.
|
||||
|
||||
![Plan](https://github.com/joe7575/doclib/blob/main/construction_plan.png)
|
||||
|
||||
A construction plan is a map with up to 12 * 10 fields.
|
||||
Each field can contain a node/item, text, or an image.
|
||||
|
||||
The arrangement is defined via a Lua table.
|
||||
|
||||
- Unused field elements are set to `false`
|
||||
- For a text field (red mark) a table like `{"text", "Pointless Demo"}` is used
|
||||
- For an item field (yellow mark) a table like `{"item", "doclib_demo_img2.png", "Tooltip 1"}` is used.
|
||||
The third value is a tooltip. It can be a string, a node name, or `nil` for no tooltip.
|
||||
- For an image field (blue mark) a table like `{"img", "doclib_book_inv.png", "2,2"}` is used.
|
||||
The third value is the image size in fields (width x height).
|
||||
|
||||
This is an example of a map with 12 * 10 fields from the demo code in `node.lua`:
|
||||
|
||||
```lua
|
||||
|
||||
local ITEM1 = {"item", "doclib_demo_img1.png"}
|
||||
local ITEM2 = {"item", "doclib_demo_img2.png", "Tooltip 1"}
|
||||
local ITEM3 = {"item", "doclib_demo_img3.png", "Tooltip 2"}
|
||||
local ITEM4 = {"item", "doclib_demo_img4.png", "Tooltip 3"}
|
||||
local ITEM5 = {"item", "doclib_book_inv.png", "doclib:manual"}
|
||||
local ITEM6 = {"item", "doclib:manual", "doclib:manual"}
|
||||
local IMG_1 = {"img", "doclib_book_inv.png", "2,2"}
|
||||
local TEXT1 = {"text", "Top view"}
|
||||
local TEXT2 = {"text", "Pointless Demo"}
|
||||
local TEXT3 = {"text", "End"}
|
||||
|
||||
local plan1 = {
|
||||
{TEXT2, false, false, false, false, false, false, false, false, false, false, ITEM4},
|
||||
{false, false, false, TEXT1, false, false, false, false, IMG_1, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false, false, false},
|
||||
{false, false, false, false, ITEM1, false, false, false, false, false, false, false},
|
||||
{false, false, false, ITEM4, ITEM5, ITEM2, false, false, false, false, false, false},
|
||||
{false, false, false, false, ITEM3, false, false, false, false, false, false, false},
|
||||
{false, false, false, false, ITEM6, false, false, false, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false, false, false},
|
||||
{TEXT3, false, false, false, false, false, false, false, false, false, false, ITEM4},
|
||||
}
|
||||
|
||||
doclib.add_manual_plan("doclib", "EN", "demo1", plan1)
|
||||
```
|
||||
|
||||
With `doclib.add_manual_plan` the plan is stored under the name "demo1".
|
||||
|
||||
|
||||
### License
|
||||
|
||||
Copyright (C) 2023 Joachim Stolberg
|
||||
|
||||
Code: Licensed under the GNU AGPL version 3. See LICENSE.txt
|
||||
Textures: CC BY-SA 3.0
|
||||
|
||||
|
||||
### Dependencies
|
||||
|
||||
none
|
||||
|
||||
|
||||
### History
|
||||
|
||||
- 2023-07-30 V1.00 * First commit
|
||||
|
||||
|
||||
|
57
doclib/api.lua
Normal file
@ -0,0 +1,57 @@
|
||||
--[[
|
||||
|
||||
DocLib
|
||||
======
|
||||
|
||||
Copyright (C) 2023 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
A library to generate ingame manuals based on markdown files.
|
||||
|
||||
]]--
|
||||
|
||||
function doclib.create_manual(mod, language, settings)
|
||||
doclib.manual = doclib.manual or {}
|
||||
doclib.manual[mod] = doclib.manual[mod] or {}
|
||||
doclib.manual[mod][language] = doclib.manual[mod][language] or {settings = settings,
|
||||
content = {
|
||||
aTitles = {},
|
||||
aTexts = {},
|
||||
aImages = {},
|
||||
aPlans = {},
|
||||
kvImages = {},
|
||||
kvPlans = {},
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
function doclib.add_to_manual(mod, language, content)
|
||||
local manual = doclib.manual[mod][language]
|
||||
|
||||
for _, item in ipairs(content.titles) do
|
||||
table.insert(manual.content.aTitles, item)
|
||||
end
|
||||
for _, item in ipairs(content.texts) do
|
||||
table.insert(manual.content.aTexts, item)
|
||||
end
|
||||
for _, item in ipairs(content.images) do
|
||||
table.insert(manual.content.aImages, item)
|
||||
end
|
||||
for _, item in ipairs(content.plans) do
|
||||
table.insert(manual.content.aPlans, item)
|
||||
end
|
||||
end
|
||||
|
||||
-- Replace image tag from the markdown file with real PNG file name or node name
|
||||
function doclib.add_manual_image(mod, language, name, image)
|
||||
local manual = doclib.manual[mod][language]
|
||||
manual.content.kvImages[name] = image
|
||||
end
|
||||
|
||||
-- Replace plan tag from the markdown file with real Lua plan table
|
||||
function doclib.add_manual_plan(mod, language, name, plan)
|
||||
local manual = doclib.manual[mod][language]
|
||||
manual.content.kvPlans[name] = plan
|
||||
end
|
BIN
doclib/construction_plan.png
Normal file
After Width: | Height: | Size: 26 KiB |
155
doclib/formspec.lua
Normal file
@ -0,0 +1,155 @@
|
||||
--[[
|
||||
|
||||
DocLib
|
||||
======
|
||||
|
||||
Copyright (C) 2023 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
A library to generate ingame manuals based on markdown files.
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local S = doclib.S
|
||||
local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end
|
||||
local S2P = minetest.string_to_pos
|
||||
local M = minetest.get_meta
|
||||
|
||||
local function get_text(text, x_offs, y_offs)
|
||||
if text == "top_view" then
|
||||
return "label[" .. x_offs .. "," .. y_offs .. ";" .. S("Top view") .. "]"
|
||||
elseif text == "side_view" then
|
||||
return "label[" .. x_offs .. "," .. y_offs .. ";" .. S("Side view") .. "]"
|
||||
elseif text == "sectional_view" then
|
||||
return "label[" .. x_offs .. "," .. y_offs .. ";" .. S("Sectional view") .. "]"
|
||||
end
|
||||
return "label[" .. x_offs .. "," .. y_offs .. ";" .. minetest.formspec_escape(text) .. "]"
|
||||
end
|
||||
|
||||
local function get_image(image, size, x_offs, y_offs)
|
||||
size = size or "2.2,2.2"
|
||||
return "image[" .. x_offs .. "," .. y_offs .. ";" .. size .. ";" .. image .. "]"
|
||||
end
|
||||
|
||||
local function get_item(item, tooltip, x_offs, y_offs)
|
||||
local ndef = minetest.registered_nodes[tooltip]
|
||||
if ndef and ndef.description then
|
||||
tooltip = minetest.formspec_escape(ndef.description)
|
||||
else
|
||||
tooltip = minetest.formspec_escape(tooltip) or ""
|
||||
end
|
||||
tooltip = "tooltip[" .. x_offs .. "," .. y_offs .. ";1,1;" .. tooltip .. ";#0C3D32;#FFFFFF]"
|
||||
|
||||
if string.find(item, ":") then
|
||||
return "item_image[" .. x_offs .. "," .. y_offs .. ";1,1;" .. item .. "]", tooltip
|
||||
else
|
||||
return "image[" .. x_offs .. "," .. y_offs .. ";1,1;" .. item .. "]", tooltip
|
||||
end
|
||||
end
|
||||
|
||||
local function get_item_data(tbl, x_offs, y_offs)
|
||||
if type(tbl) == "table" then
|
||||
local ttype = tbl[1]
|
||||
if ttype == "item" then
|
||||
return get_item(tbl[2], tbl[3], x_offs, y_offs)
|
||||
elseif ttype == "img" then
|
||||
return get_image(tbl[2], tbl[3], x_offs, y_offs), ""
|
||||
elseif ttype == "text" then
|
||||
return get_text(tbl[2], x_offs, y_offs), ""
|
||||
else
|
||||
return "", ""
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- formspec images
|
||||
local function plan(images)
|
||||
local tbl = {}
|
||||
if images == "none" then return "label[1,3;"..S("No plan available") .."]" end
|
||||
for y=1,#images do
|
||||
for x=1,#images[1] do
|
||||
local item = images[y][x] or false
|
||||
if item ~= false then
|
||||
local x_offs, y_offs = (x-1) * 0.9, (y-1) * 0.9 + 0.8
|
||||
local image, tooltip = get_item_data(item, x_offs, y_offs)
|
||||
tbl[#tbl+1] = image
|
||||
if tooltip then
|
||||
tbl[#tbl+1] = tooltip
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return table.concat(tbl)
|
||||
end
|
||||
|
||||
local function formspec_help(meta, manual)
|
||||
local idx = meta:get_int("doclib_index")
|
||||
local box = "box[9.4,1.5;1.15,1.25;#BBBBBB]"
|
||||
local bttn, symbol
|
||||
|
||||
if manual.content.aPlans[idx] ~= "" then
|
||||
bttn = "button[9.6,1;1,1;plan;" .. S("Plan") .. "]"
|
||||
elseif manual.content.aImages[idx] ~= "" then
|
||||
local name = manual.content.aImages[idx] or ""
|
||||
local item = manual.content.kvImages[name] or name
|
||||
if string.find(item, ":") then
|
||||
bttn = box .. "item_image[9.45,1.55;1.3,1.3;" .. item .. "]"
|
||||
else
|
||||
bttn = "image[9.4,1.5;1.4,1.4;" .. item .. "]"
|
||||
end
|
||||
else
|
||||
bttn = box
|
||||
end
|
||||
|
||||
if string.find(manual.settings.symbol_item, ":") then
|
||||
symbol = "item_image[9.6,0;1,1;" .. manual.settings.symbol_item .. "]"
|
||||
else
|
||||
symbol = "image[9.6,0;1,1;" .. manual.settings.symbol_item .. "]"
|
||||
end
|
||||
|
||||
return "size[11,10]" ..
|
||||
symbol ..
|
||||
"tablecolumns[tree,width=1;text,width=10,align=inline]" ..
|
||||
"tableoptions[opendepth=1]" ..
|
||||
"table[0.1,0;9,5;page;" .. table.concat(manual.content.aTitles, ",") .. ";" .. idx .. "]" ..
|
||||
bttn ..
|
||||
"box[0,5.75;10.775,4.45;#000000]" ..
|
||||
"style_type[textarea;textcolor=#FFFFFF]" ..
|
||||
"textarea[0.3,5.7;11,5.3;;;" .. (manual.content.aTexts[idx] or "") .. "]"
|
||||
end
|
||||
|
||||
local function formspec_plan(meta, manual)
|
||||
local idx = meta:get_int("doclib_index")
|
||||
local name = manual.content.aPlans[idx] or "none"
|
||||
local tbl = manual.content.kvPlans[name] or {}
|
||||
local titel = string.sub(manual.content.aTitles[idx] or "", 3) or "unknown"
|
||||
|
||||
return "size[11,10]" ..
|
||||
"label[0,0;"..titel..":]" ..
|
||||
"button[10,0;1,0.8;back;<<]" ..
|
||||
plan(tbl)
|
||||
end
|
||||
|
||||
function doclib.formspec(pos, mod, language, fields)
|
||||
local manual = doclib.manual[mod][language]
|
||||
local meta = M(pos)
|
||||
|
||||
if not fields then
|
||||
meta:set_int("doclib_index", 1)
|
||||
return formspec_help(meta, manual)
|
||||
elseif fields.plan then
|
||||
return formspec_plan(meta, manual)
|
||||
elseif fields.back then
|
||||
return formspec_help(meta, manual)
|
||||
elseif fields.page then
|
||||
local evt = minetest.explode_table_event(fields.page)
|
||||
if evt.type == "CHG" then
|
||||
local idx = tonumber(evt.row)
|
||||
meta:set_int("doclib_index", idx)
|
||||
end
|
||||
end
|
||||
return formspec_help(meta, manual)
|
||||
end
|
27
doclib/init.lua
Normal file
@ -0,0 +1,27 @@
|
||||
--[[
|
||||
|
||||
DocLib
|
||||
======
|
||||
|
||||
Copyright (C) 2023 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
A library to generate ingame manuals based on markdown files.
|
||||
|
||||
]]--
|
||||
|
||||
doclib = {}
|
||||
|
||||
-- Version for compatibility checks, see readme.md/history
|
||||
doclib.version = 1.0
|
||||
|
||||
-- Load support for I18n.
|
||||
doclib.S = minetest.get_translator("doclib")
|
||||
|
||||
local MP = minetest.get_modpath("doclib")
|
||||
|
||||
dofile(MP.."/formspec.lua")
|
||||
dofile(MP.."/api.lua")
|
||||
--dofile(MP.."/node.lua") -- only for testing purposes
|
76
doclib/manual_EN.lua
Normal file
@ -0,0 +1,76 @@
|
||||
return {
|
||||
titles = {
|
||||
"1,Heading 1",
|
||||
"2,Heading 2",
|
||||
"3,Heading 3",
|
||||
"2,Text Block",
|
||||
"2,Lists",
|
||||
"2,Code",
|
||||
"2,Construction plan",
|
||||
},
|
||||
texts = {
|
||||
"This is some demo text to demonstrate the generation of ingame manuals from\n"..
|
||||
"markdown files.\n"..
|
||||
"To open sub-chapters\\, click on the plus sign.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"This is a second-level heading.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"This is a third-level heading.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Lorem ipsum dolor sit amet\\, consetetur sadipscing elitr\\, sed diam nonumy\n"..
|
||||
"eirmod tempor invidunt ut labore et dolore magna aliquyam erat\\, sed diam\n"..
|
||||
"voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet\n"..
|
||||
"clita kasd gubergren\\, no sea takimata sanctus est Lorem ipsum dolor sit\n"..
|
||||
"amet. Lorem ipsum dolor sit amet\\, consetetur sadipscing elitr\\, sed diam\n"..
|
||||
"nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat\\,\n"..
|
||||
"sed diam voluptua.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"This is a list:\n"..
|
||||
"\n"..
|
||||
" - List\n"..
|
||||
" - List\n"..
|
||||
" - List\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"This is a code block:\n"..
|
||||
"\n"..
|
||||
" doclib.create_manual(\"doclib\"\\, \"EN\"\\, settings)\n"..
|
||||
" local content = dofile(MP..\"/manual_EN.lua\") \n"..
|
||||
" doclib.add_to_manual(\"doclib\"\\, \"EN\"\\, content)\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"This is an example\\, how to make plans/block diagrams.\n"..
|
||||
"Click an the button on the right.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
},
|
||||
images = {
|
||||
"doclib_demo_img1.png",
|
||||
"doclib_demo_img2.png",
|
||||
"doclib_demo_img3.png",
|
||||
"doclib:manual",
|
||||
"default:dirt",
|
||||
"doclib_demo_img4.png",
|
||||
"",
|
||||
},
|
||||
plans = {
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"demo1",
|
||||
}
|
||||
}
|
62
doclib/manual_EN.md
Normal file
@ -0,0 +1,62 @@
|
||||
# Heading 1
|
||||
|
||||
This is some demo text to demonstrate the generation of ingame manuals from
|
||||
markdown files.
|
||||
To open sub-chapters, click on the plus sign.
|
||||
|
||||
[doclib_demo_img1.png|image]
|
||||
|
||||
## Heading 2
|
||||
|
||||
This is a second-level heading.
|
||||
|
||||
[doclib_demo_img2.png|image]
|
||||
|
||||
### Heading 3
|
||||
|
||||
This is a third-level heading.
|
||||
|
||||
[doclib_demo_img3.png|image]
|
||||
|
||||
## Text Block
|
||||
|
||||
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
|
||||
eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
|
||||
voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
|
||||
clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit
|
||||
amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam
|
||||
nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
|
||||
sed diam voluptua.
|
||||
|
||||
[doclib:manual|image]
|
||||
|
||||
## Lists
|
||||
|
||||
This is a list:
|
||||
|
||||
- List
|
||||
- List
|
||||
- List
|
||||
|
||||
[default:dirt|image]
|
||||
|
||||
## Code
|
||||
|
||||
This is a code block:
|
||||
|
||||
```
|
||||
doclib.create_manual("doclib", "EN", settings)
|
||||
local content = dofile(MP.."/manual_EN.lua")
|
||||
doclib.add_to_manual("doclib", "EN", content)
|
||||
```
|
||||
|
||||
[doclib_demo_img4.png|image]
|
||||
|
||||
|
||||
## Construction plan
|
||||
|
||||
This is an example, how to make plans/block diagrams.
|
||||
Click an the button on the right.
|
||||
|
||||
[demo1|plan]
|
||||
|
203
doclib/markdown_to_lua.py
Normal file
@ -0,0 +1,203 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# install mistune v0.8.4 with: pip install mistune==0.8.4
|
||||
|
||||
import re
|
||||
import mistune
|
||||
|
||||
assert(mistune.__version__ == "0.8.4")
|
||||
|
||||
__version__ = "1.0"
|
||||
|
||||
class WikiLinkInlineLexer(mistune.InlineLexer):
|
||||
def enable_wiki_link(self):
|
||||
# add wiki_link rules
|
||||
self.rules.wiki_link = re.compile(
|
||||
r'\[' # [
|
||||
r'([\s\S]+?\|[\s\S]+?)' # name| img-type
|
||||
r'\](?!\])' # ]
|
||||
)
|
||||
|
||||
# Add wiki_link parser to default rules
|
||||
# you can insert it some place you like
|
||||
# but place matters, maybe 3 is not good
|
||||
self.default_rules.insert(3, 'wiki_link')
|
||||
|
||||
def output_wiki_link(self, m):
|
||||
text = m.group(1)
|
||||
name, itype = text.split('|')
|
||||
# you can create an custom render
|
||||
# you can also return the html if you like
|
||||
return self.renderer.wiki_link(name, itype)
|
||||
|
||||
class MarkdownToLua(mistune.Renderer):
|
||||
def __init__(self, *args, **kwargs):
|
||||
mistune.Renderer.__init__(self, *args, **kwargs)
|
||||
self.item_name = ""
|
||||
self.plan_table = ""
|
||||
self.is_first_header = True
|
||||
self.text_chunck = []
|
||||
self.lTitle = []
|
||||
self.lText = []
|
||||
self.lItemName = []
|
||||
self.lPlanTable = []
|
||||
print("Markdown-to-Lua v%s" % __version__)
|
||||
|
||||
def m2l_formspec_escape(self, text):
|
||||
text = text.replace("\\", "")
|
||||
text = text.replace("[", "\\\\[")
|
||||
text = text.replace("]", "\\\\]")
|
||||
text = text.replace(";", "\\\\;")
|
||||
text = text.replace(",", "\\\\,")
|
||||
text = text.replace('"', '\\"')
|
||||
text = text.replace('\n', '\\n')
|
||||
return text
|
||||
|
||||
def m2l_add_last_paragraph(self):
|
||||
"""
|
||||
Used to add a text block before the next header or at the end of the document
|
||||
"""
|
||||
self.lText.append(self.text_chunck)
|
||||
self.text_chunck = []
|
||||
self.lItemName.append(self.item_name)
|
||||
self.item_name = ""
|
||||
self.lPlanTable.append(self.plan_table)
|
||||
self.plan_table = ""
|
||||
##
|
||||
## Block Level
|
||||
##
|
||||
def block_code(self, code, lang):
|
||||
text = self.m2l_formspec_escape(code.strip())
|
||||
lines = text.split("\\n")
|
||||
lines = [" " + item for item in lines]
|
||||
self.text_chunck.extend(lines)
|
||||
self.text_chunck.append("")
|
||||
return ""
|
||||
|
||||
def header(self, text, level, raw=None):
|
||||
if not self.is_first_header:
|
||||
self.m2l_add_last_paragraph()
|
||||
self.is_first_header = False
|
||||
self.lTitle.append("%u,%s" % (level, self.m2l_formspec_escape(text)))
|
||||
return ""
|
||||
|
||||
def hrule(self):
|
||||
self.text_chunck.append("\n----------------------------------------------------\n")
|
||||
return ""
|
||||
|
||||
def paragraph(self, text):
|
||||
lines = text.split("\\n") + [""]
|
||||
self.text_chunck.extend(lines)
|
||||
return ""
|
||||
|
||||
def list(self, body, ordered=True):
|
||||
lines = body.split("\n")
|
||||
self.text_chunck.extend(lines)
|
||||
return ""
|
||||
|
||||
def list_item(self, text):
|
||||
return " - %s\n" % text.strip()
|
||||
##
|
||||
## Span Level
|
||||
##
|
||||
def emphasis(self, text):
|
||||
return "*%s*" % self.m2l_formspec_escape(text)
|
||||
|
||||
def double_emphasis(self, text):
|
||||
return "*%s*" % self.m2l_formspec_escape(text)
|
||||
|
||||
def codespan(self, text):
|
||||
return "'%s'" % self.m2l_formspec_escape(text)
|
||||
|
||||
def text(self, text):
|
||||
return self.m2l_formspec_escape(text)
|
||||
|
||||
def link(self, link, title, content):
|
||||
"""
|
||||
Used for plans and images:
|
||||
[myimage](/image/)
|
||||
[myplan](/plan/)
|
||||
"""
|
||||
if link == "/image/":
|
||||
self.item_name = content
|
||||
elif link == "/plan/":
|
||||
self.plan_table = content
|
||||
return content
|
||||
|
||||
def wiki_link(self, name, itype):
|
||||
"""
|
||||
Used for plans and images:
|
||||
[myimage|image]
|
||||
[myplan|plan]
|
||||
"""
|
||||
if itype == "image":
|
||||
self.item_name = name
|
||||
elif itype == "plan":
|
||||
self.plan_table = name
|
||||
return ""
|
||||
|
||||
def autolink(self, link, is_email=False):
|
||||
return link
|
||||
|
||||
def linebreak(self):
|
||||
return "\\n"
|
||||
|
||||
def newline(self):
|
||||
return "\\n"
|
||||
|
||||
def inline_html(self, text):
|
||||
#print(text)
|
||||
pass
|
||||
|
||||
def parse_md_file(self, src_name):
|
||||
print(" - Read MD file '%s'" % src_name)
|
||||
inline = WikiLinkInlineLexer(self)
|
||||
# enable the feature
|
||||
inline.enable_wiki_link()
|
||||
md = mistune.Markdown(renderer=self, inline=inline)
|
||||
md.renderer.src_name = src_name
|
||||
md.render(open(src_name, 'r').read())
|
||||
md.renderer.m2l_add_last_paragraph()
|
||||
|
||||
def lua_table(self, key, lData):
|
||||
lOut = []
|
||||
lOut.append(" %s = {" % key)
|
||||
for line in lData:
|
||||
lOut.append(' "%s",' % line)
|
||||
lOut.append(" }")
|
||||
return "\n".join(lOut)
|
||||
|
||||
def lua_text_table(self, key, lData):
|
||||
lOut = []
|
||||
lOut.append(" %s = {" % key)
|
||||
for lines in lData:
|
||||
for line in lines[:-1]:
|
||||
line = line.replace('<br>', '\\n')
|
||||
lOut.append(' "%s\\n"..' % line)
|
||||
if len(lines) > 0:
|
||||
lOut.append(' "%s\\n",' % lines[-1])
|
||||
else:
|
||||
lOut.append(' "",')
|
||||
lOut.append(" }")
|
||||
return "\n".join(lOut)
|
||||
|
||||
def gen_lua_file(self, dest_name):
|
||||
print(" - Write Lua file '%s'" % dest_name)
|
||||
lOut = []
|
||||
s = ",\n".join([self.lua_table("titles", self.lTitle),
|
||||
self.lua_text_table("texts", self.lText),
|
||||
self.lua_table("images", self.lItemName),
|
||||
self.lua_table("plans", self.lPlanTable)])
|
||||
open(dest_name, "w").write("return {\n%s\n}" % s)
|
||||
print("done.")
|
||||
|
||||
m2l = MarkdownToLua()
|
||||
m2l.parse_md_file("./manual_EN.md")
|
||||
m2l.gen_lua_file("./manual_EN.lua")
|
||||
|
||||
#m2l = MarkdownToLua()
|
||||
#m2l.parse_md_file("./manual_DE.md")
|
||||
#m2l.gen_lua_file("./manual_DE.lua")
|
||||
|
||||
# You can add further languages
|
3
doclib/mod.conf
Normal file
@ -0,0 +1,3 @@
|
||||
name = doclib
|
||||
description = A library to generate ingame manuals based on markdown files.
|
||||
author = joe7575
|
100
doclib/node.lua
Normal file
@ -0,0 +1,100 @@
|
||||
--[[
|
||||
|
||||
DocLib
|
||||
======
|
||||
|
||||
Copyright (C) 2023 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
A library to generate ingame manuals based on markdown files.
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local S = doclib.S
|
||||
local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end
|
||||
local S2P = minetest.string_to_pos
|
||||
local M = minetest.get_meta
|
||||
local MP = minetest.get_modpath("doclib")
|
||||
|
||||
local settings = {
|
||||
symbol_item = "doclib_book_inv.png", -- can be a PGN file or a item, like: "mod:name"
|
||||
}
|
||||
|
||||
doclib.create_manual("doclib", "EN", settings)
|
||||
local content = dofile(MP.."/manual_EN.lua")
|
||||
doclib.add_to_manual("doclib", "EN", content)
|
||||
|
||||
minetest.register_node("doclib:manual", {
|
||||
description = "DocLib Manual (EN)",
|
||||
inventory_image = "doclib_book_inv.png",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"doclib_book.png",
|
||||
"doclib_book.png",
|
||||
"doclib_book.png^[transformR270",
|
||||
"doclib_book.png^[transformR90",
|
||||
"doclib_book.png^[transformR180",
|
||||
"doclib_book.png"
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -8/32, -16/32, -12/32, 8/32, -12/32, 12/32},
|
||||
},
|
||||
},
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
M(pos):set_string("infotext", "DocLib Manual (EN)")
|
||||
M(pos):set_string("formspec", doclib.formspec(pos, "doclib", "EN"))
|
||||
end,
|
||||
|
||||
on_receive_fields = function(pos, formname, fields, player)
|
||||
local player_name = player:get_player_name()
|
||||
if minetest.is_protected(pos, player_name) then
|
||||
return
|
||||
end
|
||||
M(pos):set_string("formspec", doclib.formspec(pos, "doclib", "EN", fields))
|
||||
end,
|
||||
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
paramtype2 = "facedir",
|
||||
use_texture_alpha = "clip",
|
||||
is_ground_content = false,
|
||||
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
})
|
||||
|
||||
|
||||
--
|
||||
-- Demo plan 1
|
||||
--
|
||||
local ITEM1 = {"item", "doclib_demo_img1.png"}
|
||||
local ITEM2 = {"item", "doclib_demo_img2.png", "Tooltip 1"}
|
||||
local ITEM3 = {"item", "doclib_demo_img3.png", "Tooltip 2"}
|
||||
local ITEM4 = {"item", "doclib_demo_img4.png", "Tooltip 3"}
|
||||
local ITEM5 = {"item", "doclib_book_inv.png", "doclib:manual"}
|
||||
local ITEM6 = {"item", "doclib:manual", "doclib:manual"}
|
||||
local IMG_1 = {"img", "doclib_book_inv.png", "2,2"}
|
||||
local TEXT1 = {"text", "Top view"}
|
||||
local TEXT2 = {"text", "Pointless Demo"}
|
||||
local TEXT3 = {"text", "End"}
|
||||
|
||||
-- The maximum plan size is 12 fields wide and 10 fields high
|
||||
local plan1 = {
|
||||
{TEXT2, false, false, false, false, false, false, false, false, false, false, ITEM4},
|
||||
{false, false, false, TEXT1, false, false, false, false, IMG_1, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false, false, false},
|
||||
{false, false, false, false, ITEM1, false, false, false, false, false, false, false},
|
||||
{false, false, false, ITEM4, ITEM5, ITEM2, false, false, false, false, false, false},
|
||||
{false, false, false, false, ITEM3, false, false, false, false, false, false, false},
|
||||
{false, false, false, false, ITEM6, false, false, false, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false, false, false},
|
||||
{TEXT3, false, false, false, false, false, false, false, false, false, false, ITEM4},
|
||||
}
|
||||
|
||||
doclib.add_manual_plan("doclib", "EN", "demo1", plan1)
|
BIN
doclib/screenshot.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
doclib/textures/book.xcf
Normal file
BIN
doclib/textures/doclib_book.png
Normal file
After Width: | Height: | Size: 262 B |
BIN
doclib/textures/doclib_book_inv.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
doclib/textures/doclib_demo_img1.png
Normal file
After Width: | Height: | Size: 263 B |
BIN
doclib/textures/doclib_demo_img2.png
Normal file
After Width: | Height: | Size: 418 B |
BIN
doclib/textures/doclib_demo_img3.png
Normal file
After Width: | Height: | Size: 216 B |
BIN
doclib/textures/doclib_demo_img4.png
Normal file
After Width: | Height: | Size: 281 B |
@ -2,6 +2,12 @@
|
||||
|
||||
This LCD Lib is based on Display Lib and Font Lib from Pierre-Yves Rollo
|
||||
|
||||
### History
|
||||
|
||||
- v1.03 (2923-08-20): Add legacy mode as default mode.
|
||||
- v1.02 (2923-08-19): If a text string begins with a "\t" character, the line is centered on the display.
|
||||
|
||||
|
||||
**Dependancies**: none
|
||||
|
||||
**License**: LGPL
|
||||
|
@ -24,7 +24,7 @@ lcdlib = {}
|
||||
lcdlib.registered_fonts = {}
|
||||
|
||||
-- Version for compatibility checks
|
||||
lcdlib.version = 1.01
|
||||
lcdlib.version = 1.03
|
||||
|
||||
-- Local functions
|
||||
------------------
|
||||
@ -177,10 +177,13 @@ end
|
||||
-- @param maxlines Maximum number of lines
|
||||
-- @param valign Vertical text align ("top" or "center")
|
||||
-- @param color Color of the text
|
||||
-- @param mode (Optional parameter):
|
||||
-- If true, use "\t" to center the text, otherwise the text will be left-aligned
|
||||
-- If "false" or "nil", use "<" to left-align the text, otherwise the text will be centered (legacy mode)
|
||||
-- @return Texture string
|
||||
|
||||
function lcdlib.make_multiline_texture(font_name, text, width, height,
|
||||
maxlines, valign, color, y_offs)
|
||||
maxlines, valign, color, y_offs, mode)
|
||||
local texture = ""
|
||||
local lines = {}
|
||||
local textheight = 0
|
||||
@ -188,11 +191,21 @@ function lcdlib.make_multiline_texture(font_name, text, width, height,
|
||||
h = get_font(font_name).height
|
||||
|
||||
for num, line in pairs(split_lines(text, maxlines)) do
|
||||
if mode then
|
||||
if line:byte(1) == 9 then -- '\t'
|
||||
line = line:sub(2,-1)
|
||||
w, h = lcdlib.get_text_size(font_name, line)
|
||||
lines[num] = {text = line, width = w, height = h}
|
||||
else
|
||||
lines[num] = {text = line, width = width - 4, height = h}
|
||||
end
|
||||
else
|
||||
if line:byte(1) == 60 then -- '<'
|
||||
lines[num] = { text = line:sub(2,-1), width = width - 4, height = h, }
|
||||
lines[num] = {text = line:sub(2,-1), width = width - 4, height = h}
|
||||
else
|
||||
w, h = lcdlib.get_text_size(font_name, line)
|
||||
lines[num] = { text = line, width = w, height = h, }
|
||||
lines[num] = {text = line, width = w, height = h}
|
||||
end
|
||||
end
|
||||
textheight = textheight + h
|
||||
end
|
||||
|
@ -26,8 +26,7 @@ license).
|
||||
3. https://github.com/stujones11/railcart/
|
||||
|
||||
|
||||
Minecart Features
|
||||
-----------------
|
||||
## Minecart Features
|
||||
|
||||
The mod Minecart has its own cart (called Minecart) in addition to the standard cart.
|
||||
Minecarts are used for automated item transport on private and public rail networks.
|
||||
@ -41,14 +40,14 @@ The mod features are:
|
||||
- protection of minecarts and cargo
|
||||
- Minecarts run through unloaded areas (only the stations/hopper have to be loaded)
|
||||
- Extra Minecart privs for rail workers
|
||||
- Ingame documentation (German and English), based on the mod "doc"
|
||||
- Ingame documentation (German and English), based on the mod "doc" and/or
|
||||
doclib/techage
|
||||
- API to register carts from other mods
|
||||
- chat command `/mycart <num>` to output cart state and location
|
||||
- Command interface for Techage (Lua and ICTA) and for Beduino Controllers
|
||||
|
||||
|
||||
Technical Background
|
||||
--------------------
|
||||
## Technical Background
|
||||
|
||||
The Minecart can "run" through unloaded areas. This is done by means of recorded
|
||||
and stored routes. If the area is unloaded the cart will simply follow the
|
||||
@ -56,39 +55,11 @@ predefined route until an area is loaded again. In this case the cart will be
|
||||
spawned and run as usual.
|
||||
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
1. Place your rails and build a route with two endpoints. Junctions are allowed
|
||||
as long as each route has its own start and endpoint.
|
||||
2. Place a Railway Buffer at both endpoints. (buffers are always needed,
|
||||
they store the route and timing information)
|
||||
3. Give both Railway Buffers unique station names, like Oxford and Cambridge
|
||||
4. Place a Minecart at a buffer and give it a cart number (1..999)
|
||||
5. Drive from buffer to buffer in both directions using the Minecart(!) to record the
|
||||
routes (use 'right-left' keys to control the Minecart)
|
||||
6. Punch the buffers to check the connection data (e.g. "Oxford: connected to Cambridge")
|
||||
7. Optional: Configure the Minecart waiting time in both buffers. The Minecart
|
||||
will then start automatically after the configured time
|
||||
8. Optional: Protect your rail network with the Protection Landmarks (one Landmark
|
||||
at least every 16 nodes/meters)
|
||||
9. Place a Minecart in front of the buffer and check whether it starts after the
|
||||
configured time
|
||||
10. Check the cart state via the chat command: `/mycart <num>`
|
||||
`<num>` is the cart number, or get a list of carts with `/mycart`
|
||||
11. Drop items into the Minecart and punch the cart to start it, or "sneak+click" the
|
||||
Minecart to get cart and items back
|
||||
12. Dig the cart with 'sneak+click' (as usual). The items will be drop down.
|
||||
13. To retrieve lost carts, use the chat command: /stopcart <num>
|
||||
|
||||
|
||||
|
||||
## Manual
|
||||
|
||||
see [Wiki](https://github.com/joe7575/minecart/wiki)
|
||||
|
||||
|
||||
|
||||
## Command Interface
|
||||
|
||||
### Techage ICTA Controller
|
||||
@ -128,10 +99,7 @@ The Cart Terminal has a Beduino command interface with the commands:
|
||||
| Distance | 130 | [cart-id] | [distance] | Returns the distance from the cart to the Cart Terminal |
|
||||
|
||||
|
||||
|
||||
|
||||
History
|
||||
-------
|
||||
# History
|
||||
|
||||
2019-04-19 v0.01 first commit
|
||||
2019-04-21 v0.02 functional, with junctions support
|
||||
@ -157,3 +125,4 @@ History
|
||||
2021-10-18 V2.02 Cart reproduction bug fixed
|
||||
2023-01-04 V2.03 Techage and Beduino command interface added
|
||||
2023-02-05 V2.04 New API functions added, EOL blanks removed
|
||||
2023-08-25 V2.05 Support for doclib added
|
||||
|
@ -13,7 +13,7 @@
|
||||
minecart = {}
|
||||
|
||||
-- Version for compatibility checks, see readme.md/history
|
||||
minecart.version = 2.04
|
||||
minecart.version = 2.05
|
||||
|
||||
minecart.hopper_enabled = minetest.settings:get_bool("minecart_hopper_enabled") ~= false
|
||||
minecart.teleport_enabled = minetest.settings:get_bool("minecart_teleport_enabled") == true
|
||||
@ -47,4 +47,5 @@ if minecart.hopper_enabled then
|
||||
end
|
||||
|
||||
dofile(MP .. "/doc.lua")
|
||||
dofile(MP .. "/manual.lua")
|
||||
minetest.log("info", "[MOD] Minecart loaded")
|
||||
|
145
minecart/manual.lua
Normal file
@ -0,0 +1,145 @@
|
||||
--[[
|
||||
|
||||
Minecart
|
||||
========
|
||||
|
||||
Copyright (C) 2019-2023 Joachim Stolberg
|
||||
|
||||
MIT
|
||||
See license.txt for more information
|
||||
|
||||
InGame Documentation for techage or doclib
|
||||
|
||||
]]--
|
||||
|
||||
local MP = minetest.get_modpath("minecart")
|
||||
|
||||
minetest.register_on_mods_loaded(function()
|
||||
if minetest.global_exists("techage") then
|
||||
|
||||
-- Use the Techage Construction Board
|
||||
local content = dofile(MP.."/manual_EN.lua")
|
||||
doclib.add_to_manual("techage", "EN", content)
|
||||
local content = dofile(MP.."/manual_DE.lua")
|
||||
doclib.add_to_manual("techage", "DE", content)
|
||||
|
||||
elseif minetest.global_exists("doclib") then
|
||||
|
||||
-- Create own manual book
|
||||
local settings = {
|
||||
symbol_item = "minecart_manual_image.png",
|
||||
}
|
||||
|
||||
doclib.create_manual("minecart", "EN", settings)
|
||||
local content = dofile(MP.."/manual_EN.lua")
|
||||
doclib.add_to_manual("minecart", "EN", content)
|
||||
|
||||
doclib.create_manual("minecart", "DE", settings)
|
||||
local content = dofile(MP.."/manual_DE.lua")
|
||||
doclib.add_to_manual("minecart", "DE", content)
|
||||
|
||||
minetest.register_node("minecart:manual", {
|
||||
description = "Minecart Manual (EN)",
|
||||
inventory_image = "minecart_book_inv.png",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"minecart_book.png",
|
||||
"minecart_book.png",
|
||||
"minecart_book.png^[transformR270",
|
||||
"minecart_book.png^[transformR90",
|
||||
"minecart_book.png^[transformR180",
|
||||
"minecart_book.png"
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -8/32, -16/32, -12/32, 8/32, -12/32, 12/32},
|
||||
},
|
||||
},
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
minetest.get_meta(pos):set_string("infotext", "Minecart Manual (EN)")
|
||||
minetest.get_meta(pos):set_string("formspec", doclib.formspec(pos, "minecart", "EN"))
|
||||
end,
|
||||
|
||||
on_receive_fields = function(pos, formname, fields, player)
|
||||
local player_name = player:get_player_name()
|
||||
if minetest.is_protected(pos, player_name) then
|
||||
return
|
||||
end
|
||||
minetest.get_meta(pos):set_string("formspec", doclib.formspec(pos, "minecart", "EN", fields))
|
||||
end,
|
||||
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
paramtype2 = "facedir",
|
||||
use_texture_alpha = "clip",
|
||||
is_ground_content = false,
|
||||
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
})
|
||||
|
||||
minetest.register_node("minecart:handbuch", {
|
||||
description = "Minecart Handbuch (DE)",
|
||||
inventory_image = "minecart_book_inv.png",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"minecart_book.png",
|
||||
"minecart_book.png",
|
||||
"minecart_book.png^[transformR270",
|
||||
"minecart_book.png^[transformR90",
|
||||
"minecart_book.png^[transformR180",
|
||||
"minecart_book.png"
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -8/32, -16/32, -12/32, 8/32, -12/32, 12/32},
|
||||
},
|
||||
},
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
minetest.get_meta(pos):set_string("infotext", "Minecart Handbuch (DE)")
|
||||
minetest.get_meta(pos):set_string("formspec", doclib.formspec(pos, "minecart", "DE"))
|
||||
end,
|
||||
|
||||
on_receive_fields = function(pos, formname, fields, player)
|
||||
local player_name = player:get_player_name()
|
||||
if minetest.is_protected(pos, player_name) then
|
||||
return
|
||||
end
|
||||
minetest.get_meta(pos):set_string("formspec", doclib.formspec(pos, "minecart", "DE", fields))
|
||||
end,
|
||||
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
paramtype2 = "facedir",
|
||||
use_texture_alpha = "clip",
|
||||
is_ground_content = false,
|
||||
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "minecart:manual",
|
||||
recipe = {
|
||||
{"dye:red", "default:paper", "default:paper"},
|
||||
{"dye:black", "default:paper", "default:paper"},
|
||||
{"dye:red", "default:paper", "default:paper"},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = "shapeless",
|
||||
output = "minecart:handbuch",
|
||||
recipe = {"minecart:manual"},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = "shapeless",
|
||||
output = "minecart:manual",
|
||||
recipe = {"minecart:handbuch"},
|
||||
})
|
||||
|
||||
end
|
||||
end)
|
126
minecart/manual_DE.lua
Normal file
@ -0,0 +1,126 @@
|
||||
return {
|
||||
titles = {
|
||||
"1,Minecart",
|
||||
"2,Kurzanleitung",
|
||||
"2,Minecart-Blöcke",
|
||||
"3,Wagen",
|
||||
"3,Puffer",
|
||||
"3,Landmarken",
|
||||
"3,Trichter/Hopper",
|
||||
"3,Wagenschieber (Cart Pusher)",
|
||||
"3,Geschwindigkeitsbegrenzungsschilder",
|
||||
"2,Chat-Befehle",
|
||||
"2,Online-Handbuch",
|
||||
},
|
||||
texts = {
|
||||
"Die Mod Minecart verfügt zusätzlich zu den Standard-Wagen/Loren über eigene Wagen\n"..
|
||||
"(Minecart genannt).\n"..
|
||||
"Minecarts werden für den automatisierten Gütertransport auf privaten und öffentlichen\n"..
|
||||
"Schienennetzen eingesetzt.\n"..
|
||||
"\n"..
|
||||
"Die Hauptmerkmale sind:\n"..
|
||||
"\n"..
|
||||
" - Gütertransport von Station zu Station\n"..
|
||||
" - Wagen können durch unbeladene Bereiche (Mapblocks) fahren\n(es müssen nur beide Stationen geladen sein)\n"..
|
||||
" - Automatisiertes Be-/Entladen von Minecarts mittels Minecart Hopper\n"..
|
||||
" - Die Schienen können durch Landmarken geschützt werden\n"..
|
||||
"\n"..
|
||||
"Wenn die Mod Techage verfügbar ist:\n"..
|
||||
"\n"..
|
||||
" - Sind zwei zusätzliche Wagen für den Transport von Gegenständen und Flüssigkeiten verfügbar\n"..
|
||||
" - Können diese Wagen mit Hilfe von Techage Schiebern und Pumpen be- und entladen werden\n"..
|
||||
"\n"..
|
||||
"Du kannst:\n"..
|
||||
"\n"..
|
||||
" - den Wagen mit einem Rechtsklick besteigen\n"..
|
||||
" - den Wagen mit einem Sprung oder Rechtsklick wieder verlassen\n"..
|
||||
" - den Wagen mit einem Linksklick anschieben/starten\n"..
|
||||
"\n"..
|
||||
"Aber Minecarts haben ihren Besitzer und du kannst fremde Minecarts nicht starten\\, stoppen oder entfernen.\n"..
|
||||
"Minecarts können nur am Puffer/Prellbock gestartet werden. Wenn ein Minecarts unterwegs stehen bleibt\\,\n"..
|
||||
"entferne es und platziere es wieder an einer Puffer-Position.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
" - Platziere die Schienen und baue eine Route mit zwei Endpunkten.\nKreuzungen sind erlaubt\\, solange jede Route einen eigenen Start- und Endpunkt hat.\n"..
|
||||
" - Platziere an beiden Endpunkten einen Prellbock/Puffer (Puffer werden immer benötigt\\,\nsie speichern die Routen- und Zeitinformationen).\n"..
|
||||
" - Gebe beiden Prellböcken eindeutige Bahnhofsnamen\\, z. B. Stuttgart und München.\n"..
|
||||
" - Stelle ein Minecart an einen Puffer und gebe ihm eine Wagennummer (1..999).\n"..
|
||||
" - Fahre mit dem Minecart(!) von Puffer zu Puffer in beide Richtungen\\, um die\nStecke aufzuzeichnen (verwende die Rechts/Links-Tasten\\, um das Minecart zu steuern).\n"..
|
||||
" - Schlage auf die Puffer\\, um die Verbindungsdaten zu überprüfen\n (z. B. \"Stuttgart: verbunden mit München\").\n"..
|
||||
" - Optional: Konfiguriere die Minecart-Wartezeit in beiden Puffern.\nDas Minecart startet dann automatisch nach der konfigurierten Zeit.\n"..
|
||||
" - Stelle ein Minecart vor den Puffer und prüfe\\, ob es nach der konfigurierten Zeit\nstartet.\n"..
|
||||
" - Lege Gegenstände in das Minecart und schlage auf den Wagen\\, um ihn zu starten.\n"..
|
||||
" - Entferne den Wagen mit Shift + Rechts-Click“.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"\n"..
|
||||
"\n",
|
||||
"Wird hauptsächlich zum Transport von Gegenständen verwendet. Du kannst Gegenstände\n"..
|
||||
"in das Minecart legen und auf den Wagen schlagen\\, um ihn zu starten.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Wird als Prellbock an beiden Schienenenden verwendet. Wird benötigt\\, um die\n"..
|
||||
"Routen der Minecarts aufzeichnen und speichern zu können.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Schütze deine Schienen mit den Landmarken (mindestens alle 16 Blöcke in\n"..
|
||||
"der Nähe der Schiene eine Landmarke).\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Wird zum Laden/Entladen von Minecarts verwendet. Der Hopper kann Gegenstände\n"..
|
||||
"zu/von Truhen schieben/ziehen und Gegenstände zu/von Minecarts abgeben/abholen.\n"..
|
||||
"Um ein Minecart zu entladen\\, platziere den Trichter unterhalb der Schiene.\n"..
|
||||
"Um das Minecart zu beladen\\, platziere den Trichter direkt neben dem Minecart.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Wenn mehrere Wagen auf einer Strecke fahren\\, kann es vorkommen\\, dass eine Pufferposition\n"..
|
||||
"bereits belegt ist und ein Wagen daher früher stoppt.\n"..
|
||||
"In diesem Fall dient der Wagenschieber dazu\\, den Wagen wieder in Richtung Puffer zu schieben.\n"..
|
||||
"Dieser Block muss im Abstand von 2 m vor dem Puffer unter der Schiene platziert werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Begrenze die Geschwindigkeit der Minecarts mit Geschwindigkeitsbegrenzungsschildern.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
" - Befehl „/mycart <num>“\\, um den Status und den Standort des Minecarts auszugeben\n"..
|
||||
" - Befehl „/stopcart <num>“\\, um verlorene Minecarts abzurufen\n"..
|
||||
"\n",
|
||||
"Ein umfassendes Handbuch ist online verfügbar.\n"..
|
||||
"Siehe: https://github.com/joe7575/minecart/wiki\n"..
|
||||
"\n",
|
||||
},
|
||||
images = {
|
||||
"minecart_manual_image.png",
|
||||
"minecart_manual_image.png",
|
||||
"minecart:cart",
|
||||
"minecart:cart",
|
||||
"minecart:buffer",
|
||||
"minecart:landmark",
|
||||
"minecart:hopper",
|
||||
"minecart:cart_pusher",
|
||||
"minecart:speed2",
|
||||
"",
|
||||
"",
|
||||
},
|
||||
plans = {
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
}
|
||||
}
|
121
minecart/manual_DE.md
Normal file
@ -0,0 +1,121 @@
|
||||
# Minecart
|
||||
|
||||
Die Mod Minecart verfügt zusätzlich zu den Standard-Wagen/Loren über eigene Wagen
|
||||
(Minecart genannt).
|
||||
Minecarts werden für den automatisierten Gütertransport auf privaten und öffentlichen
|
||||
Schienennetzen eingesetzt.
|
||||
|
||||
Die Hauptmerkmale sind:
|
||||
|
||||
- Gütertransport von Station zu Station
|
||||
- Wagen können durch unbeladene Bereiche (Mapblocks) fahren
|
||||
(es müssen nur beide Stationen geladen sein)
|
||||
- Automatisiertes Be-/Entladen von Minecarts mittels Minecart Hopper
|
||||
- Die Schienen können durch Landmarken geschützt werden
|
||||
|
||||
Wenn die Mod Techage verfügbar ist:
|
||||
|
||||
- Sind zwei zusätzliche Wagen für den Transport von Gegenständen und Flüssigkeiten verfügbar
|
||||
- Können diese Wagen mit Hilfe von Techage Schiebern und Pumpen be- und entladen werden
|
||||
|
||||
Du kannst:
|
||||
|
||||
- den Wagen mit einem Rechtsklick besteigen
|
||||
- den Wagen mit einem Sprung oder Rechtsklick wieder verlassen
|
||||
- den Wagen mit einem Linksklick anschieben/starten
|
||||
|
||||
Aber Minecarts haben ihren Besitzer und du kannst fremde Minecarts nicht starten, stoppen oder entfernen.
|
||||
Minecarts können nur am Puffer/Prellbock gestartet werden. Wenn ein Minecarts unterwegs stehen bleibt,
|
||||
entferne es und platziere es wieder an einer Puffer-Position.
|
||||
|
||||
[minecart_manual_image.png|image]
|
||||
|
||||
|
||||
## Kurzanleitung
|
||||
|
||||
1. Platziere die Schienen und baue eine Route mit zwei Endpunkten.
|
||||
Kreuzungen sind erlaubt, solange jede Route einen eigenen Start- und Endpunkt hat.
|
||||
2. Platziere an beiden Endpunkten einen Prellbock/Puffer (Puffer werden immer benötigt,
|
||||
sie speichern die Routen- und Zeitinformationen).
|
||||
3. Gebe beiden Prellböcken eindeutige Bahnhofsnamen, z. B. Stuttgart und München.
|
||||
4. Stelle ein Minecart an einen Puffer und gebe ihm eine Wagennummer (1..999).
|
||||
5. Fahre mit dem Minecart(!) von Puffer zu Puffer in beide Richtungen, um die
|
||||
Stecke aufzuzeichnen (verwende die Rechts/Links-Tasten, um das Minecart zu steuern).
|
||||
6. Schlage auf die Puffer, um die Verbindungsdaten zu überprüfen
|
||||
(z. B. "Stuttgart: verbunden mit München").
|
||||
7. Optional: Konfiguriere die Minecart-Wartezeit in beiden Puffern.
|
||||
Das Minecart startet dann automatisch nach der konfigurierten Zeit.
|
||||
9. Stelle ein Minecart vor den Puffer und prüfe, ob es nach der konfigurierten Zeit
|
||||
startet.
|
||||
10. Lege Gegenstände in das Minecart und schlage auf den Wagen, um ihn zu starten.
|
||||
11. Entferne den Wagen mit Shift + Rechts-Click“.
|
||||
|
||||
[minecart_manual_image.png|image]
|
||||
|
||||
|
||||
## Minecart-Blöcke
|
||||
|
||||
[minecart:cart|image]
|
||||
|
||||
|
||||
### Wagen
|
||||
|
||||
Wird hauptsächlich zum Transport von Gegenständen verwendet. Du kannst Gegenstände
|
||||
in das Minecart legen und auf den Wagen schlagen, um ihn zu starten.
|
||||
|
||||
[minecart:cart|image]
|
||||
|
||||
|
||||
### Puffer
|
||||
|
||||
Wird als Prellbock an beiden Schienenenden verwendet. Wird benötigt, um die
|
||||
Routen der Minecarts aufzeichnen und speichern zu können.
|
||||
|
||||
[minecart:buffer|image]
|
||||
|
||||
|
||||
### Landmarken
|
||||
|
||||
Schütze deine Schienen mit den Landmarken (mindestens alle 16 Blöcke in
|
||||
der Nähe der Schiene eine Landmarke).
|
||||
|
||||
[minecart:landmark|image]
|
||||
|
||||
|
||||
### Trichter/Hopper
|
||||
|
||||
Wird zum Laden/Entladen von Minecarts verwendet. Der Hopper kann Gegenstände
|
||||
zu/von Truhen schieben/ziehen und Gegenstände zu/von Minecarts abgeben/abholen.
|
||||
Um ein Minecart zu entladen, platziere den Trichter unterhalb der Schiene.
|
||||
Um das Minecart zu beladen, platziere den Trichter direkt neben dem Minecart.
|
||||
|
||||
[minecart:hopper|image]
|
||||
|
||||
|
||||
### Wagenschieber (Cart Pusher)
|
||||
|
||||
Wenn mehrere Wagen auf einer Strecke fahren, kann es vorkommen, dass eine Pufferposition
|
||||
bereits belegt ist und ein Wagen daher früher stoppt.
|
||||
In diesem Fall dient der Wagenschieber dazu, den Wagen wieder in Richtung Puffer zu schieben.
|
||||
Dieser Block muss im Abstand von 2 m vor dem Puffer unter der Schiene platziert werden.
|
||||
|
||||
[minecart:cart_pusher|image]
|
||||
|
||||
|
||||
### Geschwindigkeitsbegrenzungsschilder
|
||||
|
||||
Begrenze die Geschwindigkeit der Minecarts mit Geschwindigkeitsbegrenzungsschildern.
|
||||
|
||||
[minecart:speed2|image]
|
||||
|
||||
|
||||
## Chat-Befehle
|
||||
|
||||
- Befehl „/mycart <num>“, um den Status und den Standort des Minecarts auszugeben
|
||||
- Befehl „/stopcart <num>“, um verlorene Minecarts abzurufen
|
||||
|
||||
|
||||
## Online-Handbuch
|
||||
|
||||
Ein umfassendes Handbuch ist online verfügbar.
|
||||
Siehe: https://github.com/joe7575/minecart/wiki
|
120
minecart/manual_EN.lua
Normal file
@ -0,0 +1,120 @@
|
||||
return {
|
||||
titles = {
|
||||
"1,Minecart",
|
||||
"2,Quick start guide",
|
||||
"2,Minecart Blocks",
|
||||
"3,Cart",
|
||||
"3,Buffer",
|
||||
"3,Landmark",
|
||||
"3,Hopper",
|
||||
"3,Cart pusher",
|
||||
"3,Speed limit signs",
|
||||
"2,Chat commands",
|
||||
"2,Online manual",
|
||||
},
|
||||
texts = {
|
||||
"The mod Minecart has its own carts (called Minecart) in addition to the standard carts.\n"..
|
||||
"Minecarts are used for automated item transport on private and public rail networks.\n"..
|
||||
"The main features are:\n"..
|
||||
"\n"..
|
||||
" - Item transport from station to station\n"..
|
||||
" - Carts can run through unloaded areas (only both stations have to be loaded)\n"..
|
||||
" - Automated loading/unloading of Minecarts by means of the Minecart Hopper\n"..
|
||||
" - The rails can be protected by means of landmarks\n"..
|
||||
"\n"..
|
||||
"If the mod Techage is available\\, then:\n"..
|
||||
"\n"..
|
||||
" - Two additional carts for item and liquid transportation are available\n"..
|
||||
" - Carts can be loaded/unloaded by means of Techage pusher and pumps\n"..
|
||||
"\n"..
|
||||
"You can:\n"..
|
||||
"\n"..
|
||||
" - Enter the cart with a right-click\n"..
|
||||
" - Leave the cart with a jump or a right-click\n"..
|
||||
" - Push/start the cart with a left-click\n"..
|
||||
"\n"..
|
||||
"But carts have their owner and you can't start\\, stop\\, or remove foreign carts.\n"..
|
||||
"Carts can only be started at the buffer. If a cart stops on the way\\,\n"..
|
||||
"remove it and place it at the buffer position.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
" - Place your rails and build a route with two endpoints.\nJunctions are allowed as long as each route has its own start and endpoint.\n"..
|
||||
" - Place a Railway Buffer at both endpoints (buffers are always needed\\,\nthey store the route and timing information).\n"..
|
||||
" - Give both Railway Buffers unique station names\\, like Oxford and Cambridge.\n"..
|
||||
" - Place a Minecart at a buffer and give it a cart number (1..999)\n"..
|
||||
" - Drive from buffer to buffer in both directions using the Minecart(!) to\nrecord the routes (use 'right-left' keys to control the Minecart).\n"..
|
||||
" - Punch the buffers to check the connection data\n(e.g. 'Oxford: connected to Cambridge').\n"..
|
||||
" - Optional: Configure the Minecart waiting time in both buffers.\nThe Minecart will then start automatically after the configured time.\n"..
|
||||
" - Place a Minecart in front of the buffer and check whether it starts\nafter the configured time.\n"..
|
||||
" - Drop items into the Minecart and punch the cart to start it.\n"..
|
||||
" - Dig the cart with 'sneak+click' (as usual). The items will be drop down.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"\n"..
|
||||
"\n",
|
||||
"Primary used to transport items. You can drop items into the Minecart and punch the cart to get started. \n"..
|
||||
"Sneak+click the cart to get cart and items back.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Used as buffer on both rail ends. Needed to be able to record the cart routes.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Protect your rails with the Landmarks (one Landmark at least every 16 blocks near the rail.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Used to load/unload Minecarts. The Hopper can push/pull items to/from chests\n"..
|
||||
"and drop/pickup items to/from Minecarts. To unload a Minecart place the hopper \n"..
|
||||
"below the rail. To load the Minecart\\, place the hopper right next to the Minecart.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"If several carts are running on one route\\, it can happen that a buffer position\n"..
|
||||
"is already occupied and one cart therefore stops earlier.\n"..
|
||||
"In this case\\, the cart pusher is used to push the cart towards the buffer again.\n"..
|
||||
"This block must be placed under the rail at a distance of 2 m in front of the buffer.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Limit the cart speed with speed limit signs.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
" - Command '/mycart <num>' to output cart state and location\n"..
|
||||
" - Command '/stopcart <num>' to retrieve lost carts\n"..
|
||||
"\n",
|
||||
"A comprehensive manual is available online.\n"..
|
||||
"See: https://github.com/joe7575/minecart/wiki\n"..
|
||||
"\n",
|
||||
},
|
||||
images = {
|
||||
"minecart_manual_image.png",
|
||||
"minecart_manual_image.png",
|
||||
"minecart:cart",
|
||||
"minecart:cart",
|
||||
"minecart:buffer",
|
||||
"minecart:landmark",
|
||||
"minecart:hopper",
|
||||
"minecart:cart_pusher",
|
||||
"minecart:speed2",
|
||||
"",
|
||||
"",
|
||||
},
|
||||
plans = {
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
}
|
||||
}
|
114
minecart/manual_EN.md
Normal file
@ -0,0 +1,114 @@
|
||||
# Minecart
|
||||
|
||||
The mod Minecart has its own carts (called Minecart) in addition to the standard carts.
|
||||
Minecarts are used for automated item transport on private and public rail networks.
|
||||
The main features are:
|
||||
|
||||
- Item transport from station to station
|
||||
- Carts can run through unloaded areas (only both stations have to be loaded)
|
||||
- Automated loading/unloading of Minecarts by means of the Minecart Hopper
|
||||
- The rails can be protected by means of landmarks
|
||||
|
||||
If the mod Techage is available, then:
|
||||
|
||||
- Two additional carts for item and liquid transportation are available
|
||||
- Carts can be loaded/unloaded by means of Techage pusher and pumps
|
||||
|
||||
You can:
|
||||
|
||||
- Enter the cart with a right-click
|
||||
- Leave the cart with a jump or a right-click
|
||||
- Push/start the cart with a left-click
|
||||
|
||||
But carts have their owner and you can't start, stop, or remove foreign carts.
|
||||
Carts can only be started at the buffer. If a cart stops on the way,
|
||||
remove it and place it at the buffer position.
|
||||
|
||||
[minecart_manual_image.png|image]
|
||||
|
||||
|
||||
## Quick start guide
|
||||
|
||||
1. Place your rails and build a route with two endpoints.
|
||||
Junctions are allowed as long as each route has its own start and endpoint.
|
||||
2. Place a Railway Buffer at both endpoints (buffers are always needed,
|
||||
they store the route and timing information).
|
||||
3. Give both Railway Buffers unique station names, like Oxford and Cambridge.
|
||||
4. Place a Minecart at a buffer and give it a cart number (1..999)
|
||||
5. Drive from buffer to buffer in both directions using the Minecart(!) to
|
||||
record the routes (use 'right-left' keys to control the Minecart).
|
||||
6. Punch the buffers to check the connection data
|
||||
(e.g. 'Oxford: connected to Cambridge').
|
||||
7. Optional: Configure the Minecart waiting time in both buffers.
|
||||
The Minecart will then start automatically after the configured time.
|
||||
9. Place a Minecart in front of the buffer and check whether it starts
|
||||
after the configured time.
|
||||
10. Drop items into the Minecart and punch the cart to start it.
|
||||
11. Dig the cart with 'sneak+click' (as usual). The items will be drop down.
|
||||
|
||||
[minecart_manual_image.png|image]
|
||||
|
||||
|
||||
## Minecart Blocks
|
||||
|
||||
[minecart:cart|image]
|
||||
|
||||
|
||||
### Cart
|
||||
|
||||
Primary used to transport items. You can drop items into the Minecart and punch the cart to get started.
|
||||
Sneak+click the cart to get cart and items back.
|
||||
|
||||
[minecart:cart|image]
|
||||
|
||||
|
||||
### Buffer
|
||||
|
||||
Used as buffer on both rail ends. Needed to be able to record the cart routes.
|
||||
|
||||
[minecart:buffer|image]
|
||||
|
||||
|
||||
### Landmark
|
||||
|
||||
Protect your rails with the Landmarks (one Landmark at least every 16 blocks near the rail.
|
||||
|
||||
[minecart:landmark|image]
|
||||
|
||||
|
||||
### Hopper
|
||||
|
||||
Used to load/unload Minecarts. The Hopper can push/pull items to/from chests
|
||||
and drop/pickup items to/from Minecarts. To unload a Minecart place the hopper
|
||||
below the rail. To load the Minecart, place the hopper right next to the Minecart.
|
||||
|
||||
[minecart:hopper|image]
|
||||
|
||||
|
||||
### Cart pusher
|
||||
|
||||
If several carts are running on one route, it can happen that a buffer position
|
||||
is already occupied and one cart therefore stops earlier.
|
||||
In this case, the cart pusher is used to push the cart towards the buffer again.
|
||||
This block must be placed under the rail at a distance of 2 m in front of the buffer.
|
||||
|
||||
[minecart:cart_pusher|image]
|
||||
|
||||
|
||||
### Speed limit signs
|
||||
|
||||
Limit the cart speed with speed limit signs.
|
||||
|
||||
[minecart:speed2|image]
|
||||
|
||||
|
||||
## Chat commands
|
||||
|
||||
- Command `/mycart <num>` to output cart state and location
|
||||
- Command `/stopcart <num>` to retrieve lost carts
|
||||
|
||||
|
||||
## Online manual
|
||||
|
||||
A comprehensive manual is available online.
|
||||
See: https://github.com/joe7575/minecart/wiki
|
201
minecart/markdown_to_lua.py
Normal file
@ -0,0 +1,201 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# install mistune v0.8.4 with: pip install mistune==0.8.4
|
||||
|
||||
import re
|
||||
import mistune
|
||||
|
||||
assert(mistune.__version__ == "0.8.4")
|
||||
|
||||
__version__ = "1.0"
|
||||
|
||||
class WikiLinkInlineLexer(mistune.InlineLexer):
|
||||
def enable_wiki_link(self):
|
||||
# add wiki_link rules
|
||||
self.rules.wiki_link = re.compile(
|
||||
r'\[' # [
|
||||
r'([\s\S]+?\|[\s\S]+?)' # name| img-type
|
||||
r'\](?!\])' # ]
|
||||
)
|
||||
|
||||
# Add wiki_link parser to default rules
|
||||
# you can insert it some place you like
|
||||
# but place matters, maybe 3 is not good
|
||||
self.default_rules.insert(3, 'wiki_link')
|
||||
|
||||
def output_wiki_link(self, m):
|
||||
text = m.group(1)
|
||||
name, itype = text.split('|')
|
||||
# you can create an custom render
|
||||
# you can also return the html if you like
|
||||
return self.renderer.wiki_link(name, itype)
|
||||
|
||||
class MarkdownToLua(mistune.Renderer):
|
||||
def __init__(self, *args, **kwargs):
|
||||
mistune.Renderer.__init__(self, *args, **kwargs)
|
||||
self.item_name = ""
|
||||
self.plan_table = ""
|
||||
self.is_first_header = True
|
||||
self.text_chunck = []
|
||||
self.lTitle = []
|
||||
self.lText = []
|
||||
self.lItemName = []
|
||||
self.lPlanTable = []
|
||||
print("Markdown-to-Lua v%s" % __version__)
|
||||
|
||||
def m2l_formspec_escape(self, text):
|
||||
text = text.replace("\\", "")
|
||||
text = text.replace("[", "\\\\[")
|
||||
text = text.replace("]", "\\\\]")
|
||||
text = text.replace(";", "\\\\;")
|
||||
text = text.replace(",", "\\\\,")
|
||||
text = text.replace('"', '\\"')
|
||||
text = text.replace('\n', '\\n')
|
||||
return text
|
||||
|
||||
def m2l_add_last_paragraph(self):
|
||||
"""
|
||||
Used to add a text block before the next header or at the end of the document
|
||||
"""
|
||||
self.lText.append(self.text_chunck)
|
||||
self.text_chunck = []
|
||||
self.lItemName.append(self.item_name)
|
||||
self.item_name = ""
|
||||
self.lPlanTable.append(self.plan_table)
|
||||
self.plan_table = ""
|
||||
##
|
||||
## Block Level
|
||||
##
|
||||
def block_code(self, code, lang):
|
||||
text = self.m2l_formspec_escape(code.strip())
|
||||
lines = text.split("\\n")
|
||||
lines = [" " + item for item in lines]
|
||||
self.text_chunck.extend(lines)
|
||||
self.text_chunck.append("")
|
||||
return ""
|
||||
|
||||
def header(self, text, level, raw=None):
|
||||
if not self.is_first_header:
|
||||
self.m2l_add_last_paragraph()
|
||||
self.is_first_header = False
|
||||
self.lTitle.append("%u,%s" % (level, self.m2l_formspec_escape(text)))
|
||||
return ""
|
||||
|
||||
def hrule(self):
|
||||
self.text_chunck.append("\n----------------------------------------------------\n")
|
||||
return ""
|
||||
|
||||
def paragraph(self, text):
|
||||
lines = text.split("\\n") + [""]
|
||||
self.text_chunck.extend(lines)
|
||||
return ""
|
||||
|
||||
def list(self, body, ordered=True):
|
||||
lines = body.split("\n")
|
||||
self.text_chunck.extend(lines)
|
||||
return ""
|
||||
|
||||
def list_item(self, text):
|
||||
return " - %s\n" % text.strip()
|
||||
##
|
||||
## Span Level
|
||||
##
|
||||
def emphasis(self, text):
|
||||
return "*%s*" % self.m2l_formspec_escape(text)
|
||||
|
||||
def double_emphasis(self, text):
|
||||
return "*%s*" % self.m2l_formspec_escape(text)
|
||||
|
||||
def codespan(self, text):
|
||||
return "'%s'" % self.m2l_formspec_escape(text)
|
||||
|
||||
def text(self, text):
|
||||
return self.m2l_formspec_escape(text)
|
||||
|
||||
def link(self, link, title, content):
|
||||
"""
|
||||
Used for plans and images:
|
||||
[myimage](/image/)
|
||||
[myplan](/plan/)
|
||||
"""
|
||||
if link == "/image/":
|
||||
self.item_name = content
|
||||
elif link == "/plan/":
|
||||
self.plan_table = content
|
||||
return content
|
||||
|
||||
def wiki_link(self, name, itype):
|
||||
"""
|
||||
Used for plans and images:
|
||||
[myimage|image]
|
||||
[myplan|plan]
|
||||
"""
|
||||
if itype == "image":
|
||||
self.item_name = name
|
||||
elif itype == "plan":
|
||||
self.plan_table = name
|
||||
return ""
|
||||
|
||||
def autolink(self, link, is_email=False):
|
||||
return link
|
||||
|
||||
def linebreak(self):
|
||||
return "\\n"
|
||||
|
||||
def newline(self):
|
||||
return "\\n"
|
||||
|
||||
def inline_html(self, text):
|
||||
#print(text)
|
||||
pass
|
||||
|
||||
def parse_md_file(self, src_name):
|
||||
print(" - Read MD file '%s'" % src_name)
|
||||
inline = WikiLinkInlineLexer(self)
|
||||
# enable the feature
|
||||
inline.enable_wiki_link()
|
||||
md = mistune.Markdown(renderer=self, inline=inline)
|
||||
md.renderer.src_name = src_name
|
||||
md.render(open(src_name, 'r').read())
|
||||
md.renderer.m2l_add_last_paragraph()
|
||||
|
||||
def lua_table(self, key, lData):
|
||||
lOut = []
|
||||
lOut.append(" %s = {" % key)
|
||||
for line in lData:
|
||||
lOut.append(' "%s",' % line)
|
||||
lOut.append(" }")
|
||||
return "\n".join(lOut)
|
||||
|
||||
def lua_text_table(self, key, lData):
|
||||
lOut = []
|
||||
lOut.append(" %s = {" % key)
|
||||
for lines in lData:
|
||||
for line in lines[:-1]:
|
||||
line = line.replace('<br>', '\\n')
|
||||
lOut.append(' "%s\\n"..' % line)
|
||||
if len(lines) > 0:
|
||||
lOut.append(' "%s\\n",' % lines[-1])
|
||||
else:
|
||||
lOut.append(' "",')
|
||||
lOut.append(" }")
|
||||
return "\n".join(lOut)
|
||||
|
||||
def gen_lua_file(self, dest_name):
|
||||
print(" - Write Lua file '%s'" % dest_name)
|
||||
lOut = []
|
||||
s = ",\n".join([self.lua_table("titles", self.lTitle),
|
||||
self.lua_text_table("texts", self.lText),
|
||||
self.lua_table("images", self.lItemName),
|
||||
self.lua_table("plans", self.lPlanTable)])
|
||||
open(dest_name, "w").write("return {\n%s\n}" % s)
|
||||
print("done.")
|
||||
|
||||
m2l = MarkdownToLua()
|
||||
m2l.parse_md_file("./manual_EN.md")
|
||||
m2l.gen_lua_file("./manual_EN.lua")
|
||||
|
||||
m2l = MarkdownToLua()
|
||||
m2l.parse_md_file("./manual_DE.md")
|
||||
m2l.gen_lua_file("./manual_DE.lua")
|
@ -1,4 +1,4 @@
|
||||
name=minecart
|
||||
depends = default,carts
|
||||
optional_depends = doc
|
||||
optional_depends = doc, doclib
|
||||
description = Minecart, the lean railway transportation automation system
|
||||
|
BIN
minecart/textures/minecart_book.png
Normal file
After Width: | Height: | Size: 262 B |
BIN
minecart/textures/minecart_book_inv.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
minecart/textures/minecart_manual_image.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
@ -10,180 +10,24 @@ Download: [GitHub](https://github.com/joe7575/signs_bot/archive/master.zip)
|
||||
![Signs Bot](https://github.com/joe7575/signs_bot/blob/master/screenshot.png)
|
||||
|
||||
|
||||
The bot can only be controlled by signs that are placed in its path.
|
||||
The bot starts running after starting until it encounters a sign. There, the commands are then processed on the sign.
|
||||
The bot can also put himself signs in the way, which he then works off.
|
||||
There is also a sign that can be programmed by the player, which then are processed by the bot.
|
||||
### Introduction
|
||||
See [manual](https://github.com/joe7575/signs_bot/blob/master/manual_EN.md)
|
||||
|
||||
There are also the following blocks:
|
||||
- Sensors: These can send a signal to an actuator if they are connected to the actuator.
|
||||
- Actuators: These perform an action when they receive a signal from a sensor.
|
||||
The mod has an in-game help to all blocks and signs.
|
||||
If 'techage' is installed, the techage ingame manual will be expanded.
|
||||
If techage is not installed, it is recommended that you have installed the
|
||||
mod doclib.
|
||||
|
||||
Sensors must be connected (paired) with actuators. This is what the Connection Tool does. Click on both blocks one after the other.
|
||||
A successful pairing is indicated by a ping / pong noise.
|
||||
When pairing, the state of the actuator is important. In the case of the bot box, for example, the states "on" and "off", in the case of the control unit 1,2,3,4, etc.
|
||||
The state of the actuator is saved with the pairing and restored by the signal. For example, the robot can be switched on via a node sensor.
|
||||
|
||||
An actuator can receive signals from many sensors. A sensor can only be connected to an actuator. However, if several actuators are to be controlled by one sensor, a signal extender block must be used. This connects to a sensor when it is placed next to the sensor. This extender can then be paired with another actuator.
|
||||
|
||||
Sensors are:
|
||||
- Bot Sensor: Sends a signal when the robot passes by
|
||||
- Node Sensor: Sends a signal when it detects a change (tree, cactus, flower, etc.) in front of the sensor (over 3 positions)
|
||||
- Crop Sensor: Sends a signal when, for example, the wheat is fully grown
|
||||
- Bot Chest: Sends a signal depending on the chest state. Possible states are "empty", "not empty", "almost full". The state to be sent is defined while pairing.
|
||||
|
||||
Actuators are:
|
||||
- Control Unit: Can place up to 4 signs and steer the bot e.g. in different directions.
|
||||
- Signs Bot Box: Can be turned off and on
|
||||
|
||||
In addition, there are currently the following blocks:
|
||||
- The duplicator is used to copy Command Signs, i.e. the signs with their own commands.
|
||||
- Bot Flap: The "cat flap" is a door for the bot, which he opens automatically and closes behind him.
|
||||
- Sensor Extender for controlling additional actuators from one sensor signal
|
||||
- A Timer can be used to start the Bot cyclically
|
||||
- A Delayer can be used to delay and queue signals
|
||||
|
||||
More information:
|
||||
- Using the signs "take" and "add", the bot can pick items from Chests and put them in. The signs must be placed on the box. So far, only a few blocks are supported with Inventory.
|
||||
- The Control Unit can be charged with up to 4 labels. To do this, place a label next to the Control Unit and click on the Control Unit. The sign is only stored under this number.
|
||||
- The inventory of the Signs Bot Box is intended to represent the inventory of the Robot. As long as the robot is on the road, of course you have no access.
|
||||
|
||||
The copy function can be used to clone node cubes up to 5x3x3 nodes. There is the pattern shield for the template position and the copy shield for the "3x3x3" copy. Since the bot also copies air blocks, the function can also be used for mining or tunnels. The items to be placed must be in the inventory. Items that the bot degrades are in Inventory afterwards. If there are missing items in the inventory during copying, he will set "missing items" blocks, which dissolve into air when degrading.
|
||||
|
||||
In-game help:
|
||||
The mod has an in-game help to all blocks and signs. Therefore, it is highly recommended that you have installed the mods 'doc' and 'unified_inventory'.
|
||||
|
||||
### Commands:
|
||||
The commands are also all described as help in the "Sign command" node.
|
||||
All blocks or signs that are set are taken from the bot inventory.
|
||||
Any blocks or signs removed will be added back to the Bot Inventory.
|
||||
`<slot>` is always the bot internal inventory stack (1..8).
|
||||
For all Inventory commands applies: If the bot inventory stack specified by `<slot>` is full, so that nothing more can be done, or just empty, so that nothing more can be removed, the next slot will automatically be used.
|
||||
|
||||
move <steps> - to follow one or more steps forward without signs
|
||||
cond_move - walk to the next sign and work it off
|
||||
turn_left - turn left
|
||||
turn_right - turn right
|
||||
turn_around - turn around
|
||||
backward - one step backward
|
||||
turn_off - turn off the robot / back to the box
|
||||
pause <sec> - wait one or more seconds
|
||||
move_up - move up (maximum 2 times)
|
||||
move_down - move down
|
||||
fall_down - fall into a hole/chasm (up to 10 blocks)
|
||||
take_item <num> <slot> - take one or more items from a box
|
||||
add_item <num> <slot> - put one or more items in a box
|
||||
add_fuel <num> <slot> - for furnaces or similar
|
||||
place_front <slot> <lvl> - Set block in front of the robot
|
||||
place_left <slot> <lvl> - Set block to the left
|
||||
place_right <slot> <lvl> - set block to the right
|
||||
place_below <slot> - set block under the robot
|
||||
place_above <slot> - set block above the robot
|
||||
dig_front <slot> <lvl> - remove block in front of the robot
|
||||
dig_left <slot> <lvl> - remove block on the left
|
||||
dig_right <slot> <lvl> - remove block on the right
|
||||
dig_below <slot> - dig block under the robot
|
||||
dig_above <slot> - dig block above the robot
|
||||
rotate_item <lvl> <steps> - rotate a block in front of the robot
|
||||
set_param2 <lvl> <param2> - set param2 of the block in front of the robot
|
||||
place_sign <slot> - set sign
|
||||
place_sign_behind <slot> - put a sign behind the bot
|
||||
dig_sign <slot> - remove the sign
|
||||
trash_sign <slot> - Remove the sign, clear data and add to the item Inventory
|
||||
stop - Bot stops until the shield is removed
|
||||
pickup_items <slot> - pickup items (in a 3x3 field)
|
||||
drop_items <num> <slot> - drop items
|
||||
harvest - harvest a 3x3 field (farming)
|
||||
cutting - cut a 3x3 flower field
|
||||
sow_seed <slot> - a 3x3 field sowing / planting
|
||||
plant_sapling <slot> - plant a sapling in front of the robot
|
||||
pattern - save the blocks behind the shield (up to 5x3x3) as template
|
||||
copy <size> - make a copy of "pattern". Size is e.g. 3x3 (see ingame help)
|
||||
punch_cart - Punch a rail cart to start it
|
||||
add_compost <slot> - Put 2 leaves into the compost barrel
|
||||
take_compost <slot> - Take a compost item from the barrel
|
||||
print <text> - Output chat message for debug purposes
|
||||
take_water <slot> - Take water with empty bucket
|
||||
fill_cauldron <slot> - Fill the xdecor cauldron for a soup
|
||||
take_soup <slot> - Take boiling soup into empty bowl from cauldron
|
||||
flame_on - Make fire
|
||||
flame_off - Put out the fire
|
||||
|
||||
#### Techage specific commands
|
||||
|
||||
ignite - Ignite the techage charcoal lighter
|
||||
low_batt <percent> - Turn the bot off if the battery power is below the
|
||||
given value in percent (1..99)
|
||||
jump_low_batt <percent> <label> - Jump to <label> if the battery power is below the
|
||||
given value in percent (1..99)
|
||||
(see "Flow control commands")
|
||||
send_cmnd <receiver> <command> - Send a techage command to a given node.
|
||||
Receiver is addressed by the techage node number.
|
||||
For commands with two or more words, use the '*' character
|
||||
instead of spaces, e.g.: send_cmnd 3465 pull*default:dirt*2
|
||||
|
||||
|
||||
#### Flow control commands
|
||||
|
||||
jump <label> -- jump command, <label> is a word from the characters a-z or A-Z
|
||||
<label>: -- jump label / start of a function
|
||||
return -- return from a function
|
||||
repeat <num> -- start of a loop block, <num> is a number 1..999
|
||||
end -- end of a loop block
|
||||
call <label> -- call of a function (with return via the command 'return')
|
||||
|
||||
#### Further jump commands
|
||||
|
||||
jump_check_item <num> <slot> <label> - Check if there are <num> items in the chest like node.
|
||||
If not, jump to <label>.
|
||||
<slot> is the bot inventory slot (1..8) to specify the item,
|
||||
or 0 for any item.
|
||||
jump_low_batt <percent> <label> - See "Techage specific commands"
|
||||
|
||||
|
||||
|
||||
Example with a function at the beginning:
|
||||
|
||||
jump main -- jump to the label 'main'
|
||||
|
||||
foo: -- starting point of the function with the name 'foo'
|
||||
cmnd ...
|
||||
cmnd ...
|
||||
return -- end of 'foo'. Jump back
|
||||
|
||||
main: -- main program
|
||||
cmnd ...
|
||||
repeat 10 -- repeat all commands up to 'end' 10 times
|
||||
cmnd ...
|
||||
call foo -- call the subfunction 'foo'
|
||||
cmnd ...
|
||||
end -- end of the 'repeat' loop
|
||||
exit -- end of the program
|
||||
|
||||
Or alternatively with the function at the end:
|
||||
|
||||
cmnd ...
|
||||
repeat 10 -- repeat all commands up to 'end' 10 times
|
||||
cmnd ...
|
||||
call foo -- call the subfunction 'foo'
|
||||
cmnd ...
|
||||
end -- end of the 'repeat' loop
|
||||
exit -- end of the program
|
||||
|
||||
foo: -- starting point of the function with the name 'foo'
|
||||
cmnd ...
|
||||
cmnd ...
|
||||
return -- end of 'foo'. Jump back
|
||||
|
||||
### License
|
||||
Copyright (C) 2019-2022 Joachim Stolberg
|
||||
Copyright (C) 2019-2023 Joachim Stolberg
|
||||
Copyright (C) 2021 Michal 'Micu' Cieslakiewicz (soup commands)
|
||||
Code: Licensed under the GNU GPL version 3 or later. See LICENSE.txt
|
||||
|
||||
|
||||
### Dependencies
|
||||
default, farming, basic_materials, tubelib2
|
||||
optional: farming redo, node_io, doc, techage, minecart, xdecor, compost
|
||||
optional: farming redo, node_io, doc, techage, minecart, xdecor, compost, doclib
|
||||
|
||||
|
||||
### History
|
||||
@ -213,5 +57,8 @@ optional: farming redo, node_io, doc, techage, minecart, xdecor, compost
|
||||
- 2021-09-18 v1.10 * Add techage command 'set <num>' to the Bot Control Unit
|
||||
- 2022-03-19 V1.11 * Extend farming (and add ethereal) support (Thanks to nixnoxus)
|
||||
- 2022-09-11 V1.12 * Add commands `jump_low_batt` , `jump_check_item`, and `fall_down`
|
||||
- 2023-06-27 V1.13 * Add Beduino command support (see bep-006_sb_cmnd.md)
|
||||
- 2023-07-28 V1.13 * Introduction/manual restructured, doclib dependency added
|
||||
|
||||
|
||||
|
||||
|
@ -186,10 +186,12 @@ local function set_capa(pos, oldnode, digger, capa)
|
||||
local text = S("Robot Box").." ("..capa.." %)"
|
||||
meta:set_string("description", text)
|
||||
local inv = minetest.get_inventory({type="player", name=digger:get_player_name()})
|
||||
if inv then
|
||||
local left_over = inv:add_item("main", node)
|
||||
if left_over:get_count() > 0 then
|
||||
minetest.add_item(pos, node)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function signs_bot.infotext(pos, state)
|
||||
|
24
signs_bot/bep-006_sb_cmnd.md
Normal file
@ -0,0 +1,24 @@
|
||||
| Author | Version | Status | Modified |
|
||||
| ---------- | ------- | -------- | ----------- |
|
||||
| J.Stolberg | 0.1 | Proposal | 27 Jun 2023 |
|
||||
|
||||
|
||||
|
||||
# BEP 006: Signs Bot Commands
|
||||
|
||||
### Send Command / Trigger Action
|
||||
|
||||
| Command | Topic (num) | Payload (array/string) | Remarks |
|
||||
| ----------- | ----------- | ---------------------- | ------------------------------------------------------------ |
|
||||
| Turn on/off | 1 | [num] | Turn bot on/off<br />*num* is the state: 0 = "off", 1 = "on" |
|
||||
| | | | |
|
||||
| | | | |
|
||||
|
||||
|
||||
### Request Data
|
||||
|
||||
| Command | Topic (num) | Payload (array/string) | Response (array/string) | Remarks to the response |
|
||||
| --------- | ----------- | ---------------------- | ----------------------- | ------------------------------------------------------------ |
|
||||
| Bot State | 128 | - | [num] | RUNNING = 1, BLOCKED = 2,<br /> STANDBY = 3, NOPOWER = 4,<br />FAULT = 5, STOPPED = 6,<br />CHARCHING = 7 |
|
||||
| | | | | |
|
||||
| | | | | |
|
@ -15,6 +15,7 @@
|
||||
local S = signs_bot.S
|
||||
|
||||
local lib = signs_bot.lib
|
||||
local not_farming_redo = farming.mod ~= "redo"
|
||||
|
||||
local bot_inv_put_item = signs_bot.bot_inv_put_item
|
||||
local bot_inv_take_item = signs_bot.bot_inv_take_item
|
||||
@ -47,6 +48,9 @@ local function planting(base_pos, mem, slot)
|
||||
minetest.set_node(pos, {name = item})
|
||||
end
|
||||
minetest.sound_play("default_place_node", {pos = pos, gain = 1.0})
|
||||
if not_farming_redo then
|
||||
minetest.get_node_timer(pos):start(math.random(166, 286))
|
||||
end
|
||||
else
|
||||
bot_inv_put_item(base_pos, 0, ItemStack(plant))
|
||||
end
|
||||
|
@ -319,9 +319,15 @@ signs_bot.register_botcommand("stop", {
|
||||
num_param = 0,
|
||||
description = S("Stop the robot."),
|
||||
cmnd = function(base_pos, mem, slot)
|
||||
local param2 = mem.robot_param2
|
||||
local pos = mem.robot_pos
|
||||
local node1, pos1 = node_and_pos(lib.next_pos(pos, param2))
|
||||
if mem.capa then
|
||||
mem.capa = mem.capa + 2
|
||||
end
|
||||
if node1 and node1.name ~= "signs_bot:sign_stop" then
|
||||
return signs_bot.DONE
|
||||
end
|
||||
return signs_bot.BUSY
|
||||
end,
|
||||
})
|
||||
|
@ -243,6 +243,7 @@ local function move(mem, any_sensor)
|
||||
elseif mem.capa then
|
||||
mem.capa = mem.capa + 1
|
||||
end
|
||||
return new_pos ~= nil
|
||||
end
|
||||
|
||||
signs_bot.register_botcommand("move", {
|
||||
@ -278,8 +279,10 @@ new program from the sign]]),
|
||||
cmnd = function(base_pos, mem)
|
||||
local any_sensor, sign_pos = scan_surrounding(mem)
|
||||
if not sign_pos then
|
||||
move(mem, any_sensor)
|
||||
if move(mem, any_sensor) then
|
||||
return ci.BUSY
|
||||
end
|
||||
return signs_bot.DONE
|
||||
else
|
||||
mem.script = M(sign_pos):get_string("signs_bot_cmnd").."\ncond_move"
|
||||
return ci.NEW
|
||||
|
26
signs_bot/del_eol_blanks.py
Executable file
@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env python
|
||||
import os
|
||||
|
||||
spath = "./"
|
||||
n = len(spath)
|
||||
|
||||
for root, dirs, files in os.walk(spath):
|
||||
offs = root[n:]
|
||||
for fname in files:
|
||||
name, ext = os.path.splitext(fname)
|
||||
if ext == ".lua":
|
||||
src = os.path.join(spath, offs, fname)
|
||||
lOut = []
|
||||
changed = False
|
||||
for line in open(src, "rt").readlines():
|
||||
line2 = line.rstrip()
|
||||
if len(line2) != len(line) - 1:
|
||||
changed = True
|
||||
lOut.append(line2)
|
||||
if changed:
|
||||
print("%s changed" % src)
|
||||
text = "\n".join(lOut) + "\n"
|
||||
open(src, "wt").write(text)
|
||||
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
GPLv3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
Signs Bot: Bot Flap
|
||||
Signs Bot: Ingame Documentation
|
||||
|
||||
]]--
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
Signs Bot
|
||||
=========
|
||||
|
||||
Copyright (C) 2019-2021 Joachim Stolberg
|
||||
Copyright (C) 2019-2023 Joachim Stolberg
|
||||
|
||||
GPL v3
|
||||
See LICENSE.txt for more information
|
||||
@ -15,7 +15,7 @@
|
||||
signs_bot = {}
|
||||
|
||||
-- Version for compatibility checks, see readme.md/history
|
||||
signs_bot.version = 1.12
|
||||
signs_bot.version = 1.13
|
||||
|
||||
-- Test for MT 5.4 new string mode
|
||||
signs_bot.CLIP = minetest.features.use_texture_alpha_string_modes and "clip" or true
|
||||
@ -75,5 +75,6 @@ dofile(MP.."/timer.lua")
|
||||
dofile(MP.."/delayer.lua")
|
||||
dofile(MP.."/logic_and.lua")
|
||||
dofile(MP.."/compost.lua")
|
||||
|
||||
dofile(MP.."/manual.lua")
|
||||
dofile(MP.."/tool.lua")
|
||||
|
||||
|
@ -432,8 +432,8 @@ The sensor has an active side (red) that must point to the observed area.=Der Se
|
||||
|
||||
Instructions:=Anweisungen:
|
||||
Code=Code
|
||||
Sign "turn right"=Zeichen "rechts drehen"
|
||||
Sign "turn left"=Zeichen "links drehen"
|
||||
Sign "turn right"=Zeichen "Rechts drehen"
|
||||
Sign "turn left"=Zeichen "Links drehen"
|
||||
Sign "take item"=Zeichen "Nehme Gegenstand"
|
||||
Sign "add item"=Zeichen "Lege Gegenstand"
|
||||
Sign "stop"=Zeichen "Stopp"
|
||||
|
143
signs_bot/manual.lua
Normal file
@ -0,0 +1,143 @@
|
||||
--[[
|
||||
|
||||
Signs Bot
|
||||
=========
|
||||
|
||||
Copyright (C) 2019-2021 Joachim Stolberg
|
||||
|
||||
GPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
InGame Documentation for techage or doclib
|
||||
|
||||
]]--
|
||||
|
||||
local MP = minetest.get_modpath("signs_bot")
|
||||
|
||||
if minetest.global_exists("techage") then
|
||||
|
||||
-- Use the Techage Construction Board
|
||||
local content = dofile(MP.."/manual_EN.lua")
|
||||
doclib.add_to_manual("techage", "EN", content)
|
||||
local content = dofile(MP.."/manual_DE.lua")
|
||||
doclib.add_to_manual("techage", "DE", content)
|
||||
|
||||
elseif minetest.global_exists("doclib") then
|
||||
|
||||
-- Create own manual book
|
||||
local settings = {
|
||||
symbol_item = "signs_bot_bot_inv.png",
|
||||
}
|
||||
|
||||
doclib.create_manual("signs_bot", "EN", settings)
|
||||
local content = dofile(MP.."/manual_EN.lua")
|
||||
doclib.add_to_manual("signs_bot", "EN", content)
|
||||
|
||||
doclib.create_manual("signs_bot", "DE", settings)
|
||||
local content = dofile(MP.."/manual_DE.lua")
|
||||
doclib.add_to_manual("signs_bot", "DE", content)
|
||||
|
||||
minetest.register_node("signs_bot:manual", {
|
||||
description = "Signs Bot Manual (EN)",
|
||||
inventory_image = "doclib_book_inv.png",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"doclib_book.png",
|
||||
"doclib_book.png",
|
||||
"doclib_book.png^[transformR270",
|
||||
"doclib_book.png^[transformR90",
|
||||
"doclib_book.png^[transformR180",
|
||||
"doclib_book.png"
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -8/32, -16/32, -12/32, 8/32, -12/32, 12/32},
|
||||
},
|
||||
},
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
minetest.get_meta(pos):set_string("infotext", "Signs Bot Manual (EN)")
|
||||
minetest.get_meta(pos):set_string("formspec", doclib.formspec(pos, "signs_bot", "EN"))
|
||||
end,
|
||||
|
||||
on_receive_fields = function(pos, formname, fields, player)
|
||||
local player_name = player:get_player_name()
|
||||
if minetest.is_protected(pos, player_name) then
|
||||
return
|
||||
end
|
||||
minetest.get_meta(pos):set_string("formspec", doclib.formspec(pos, "signs_bot", "EN", fields))
|
||||
end,
|
||||
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
paramtype2 = "facedir",
|
||||
use_texture_alpha = "clip",
|
||||
is_ground_content = false,
|
||||
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
})
|
||||
|
||||
minetest.register_node("signs_bot:handbuch", {
|
||||
description = "Signs Bot Handbuch (DE)",
|
||||
inventory_image = "doclib_book_inv.png",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"doclib_book.png",
|
||||
"doclib_book.png",
|
||||
"doclib_book.png^[transformR270",
|
||||
"doclib_book.png^[transformR90",
|
||||
"doclib_book.png^[transformR180",
|
||||
"doclib_book.png"
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -8/32, -16/32, -12/32, 8/32, -12/32, 12/32},
|
||||
},
|
||||
},
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
minetest.get_meta(pos):set_string("infotext", "Signs Bot Handbuch (DE)")
|
||||
minetest.get_meta(pos):set_string("formspec", doclib.formspec(pos, "signs_bot", "DE"))
|
||||
end,
|
||||
|
||||
on_receive_fields = function(pos, formname, fields, player)
|
||||
local player_name = player:get_player_name()
|
||||
if minetest.is_protected(pos, player_name) then
|
||||
return
|
||||
end
|
||||
minetest.get_meta(pos):set_string("formspec", doclib.formspec(pos, "signs_bot", "DE", fields))
|
||||
end,
|
||||
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
paramtype2 = "facedir",
|
||||
use_texture_alpha = "clip",
|
||||
is_ground_content = false,
|
||||
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "signs_bot:manual",
|
||||
recipe = {
|
||||
{"dye:green", "default:paper", "default:paper"},
|
||||
{"dye:black", "default:paper", "default:paper"},
|
||||
{"dye:green", "default:paper", "default:paper"},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = "shapeless",
|
||||
output = "signs_bot:handbuch",
|
||||
recipe = {"signs_bot:manual"},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = "shapeless",
|
||||
output = "signs_bot:manual",
|
||||
recipe = {"signs_bot:handbuch"},
|
||||
})
|
||||
|
||||
end
|
622
signs_bot/manual_DE.lua
Normal file
@ -0,0 +1,622 @@
|
||||
return {
|
||||
titles = {
|
||||
"1,Signs Bot",
|
||||
"2,Erste Schritte",
|
||||
"2,Schilder",
|
||||
"2,Sensors and Actuators",
|
||||
"2,Sensor Verbindungswerkzeug",
|
||||
"2,Inventar",
|
||||
"2,Blöcke",
|
||||
"3,Signs Bot Box",
|
||||
"3,Bot Klappe",
|
||||
"3,Zeichen Kopierer",
|
||||
"3,Bot Sensor",
|
||||
"3,Block Sensor",
|
||||
"3,Ernte Sensor",
|
||||
"3,Signs Bot Kiste",
|
||||
"3,Bot Timer",
|
||||
"3,Roboter Steuerungseinheit",
|
||||
"3,Sensor Erweiterung",
|
||||
"3,Signal AND",
|
||||
"3,Signal Verzögerer",
|
||||
"3,Zeichen 'Farming'",
|
||||
"3,Zeichen 'Vorlage'",
|
||||
"3,Zeichen 'kopiere 3x3x3'",
|
||||
"3,Zeichen 'Blumen'",
|
||||
"3,Zeichen 'Espe'",
|
||||
"3,Zeichen 'Kommando'",
|
||||
"3,Zeichen \"Rechts drehen\"",
|
||||
"3,Zeichen \"Links drehen\"",
|
||||
"3,Zeichen \"Nehme Gegenstand\"",
|
||||
"3,Zeichen \"Lege Gegenstand\"",
|
||||
"3,Zeichen \"Stopp\"",
|
||||
"3,Zeichen \"Lege in den Wagen\" (minecart)",
|
||||
"3,Zeichen \"Nehme aus dem Wagen\" (minecart)",
|
||||
"3,Zeichen 'Schöpfe Wasser' (xdecor)",
|
||||
"3,Zeichen 'Koche Suppe' (xdecor)",
|
||||
"2,Bot Kommandos",
|
||||
"3,Techage spezifische Kommandos",
|
||||
"3,Flow Control Kommandos",
|
||||
"3,Weitere Sprungkommands",
|
||||
"3,Flow Control Beispiele",
|
||||
"4,Beispiel mit einer Funktion am Anfang:",
|
||||
"4,Beispiel mit einer Funktion am Ende:",
|
||||
},
|
||||
texts = {
|
||||
"Ein durch Zeichen/Schilder gesteuerter Roboter.\n"..
|
||||
"\n"..
|
||||
"Web Doku: https://github.com/joe7575/signs_bot/blob/master/manual_DE.md\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Nachdem du die Signs Bot Box platziert hast\\, kannst du den Bot über die\n"..
|
||||
"Schaltfläche „An“ im Boxmenü starten. Wenn der Bot sofort in seine Box zurückkehrt\\,\n"..
|
||||
"muss der Bot zuerst mit elektrischer Energie (Techage) aufgeladen werden.\n"..
|
||||
"Anschließend läuft der Bot geradeaus\\, bis er auf ein Hindernis trifft\n"..
|
||||
"(eine Stufe mit zwei oder mehr Blöcken nach oben oder unten\\, oder ein Schild.)\n"..
|
||||
"\n"..
|
||||
"Der Bot kann nur durch Schilder gesteuert werden\\, die ihm in den Weg gestellt werden.\n"..
|
||||
"\n"..
|
||||
"Falls der Bot ein Schild erreicht\\, führt er die Befehle auf dem Schild aus.\n"..
|
||||
"Falls der erste Befehl auf dem Schild z.B. lautet: „turn_around“\\, dreht sich der Bot \n"..
|
||||
"um und geht zurück. In diesem Fall erreicht der Bot seine Box erneut und\n"..
|
||||
"schaltet sich ab.\n"..
|
||||
"\n"..
|
||||
"Falls der Bot ein Hindernis erreicht\\, stoppt er\\, oder führt\\, falls verfügbar\\,\n"..
|
||||
"den nächsten Befehle vom letzten Schild aus.\n"..
|
||||
"\n"..
|
||||
"Die Signs Bot Box verfügt über ein Inventar mit 6 Slots (Speicherplätze) für Schilder\n"..
|
||||
"und 8 Slots für andere Gegenstände (die vom Bot platziert/abgebaut werden).\n"..
|
||||
"Dieses Inventar simuliert das interne Inventar des Bots. Das bedeutet\\, dass du\n"..
|
||||
"nur dann Zugriff auf das Inventar hast\\, wenn der Bot ausgeschaltet ist\n"..
|
||||
"(in seiner Box „sitzt“).\n"..
|
||||
"\n"..
|
||||
"Außerdem gibt es folgende Blöcke:\n"..
|
||||
"\n"..
|
||||
" - Sensoren: Diese können ein Signal an einen Aktor senden\\, wenn sie mit dem\nAktor verbunden sind.\n"..
|
||||
" - Aktoren: Diese führen eine Aktion aus\\, wenn sie ein Signal von einem Sensor empfangen.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Du steuerst die Richtung des Bots über die „links drehen“ und\n"..
|
||||
"„rechts drehen“-Schilder (Schilder mit dem Pfeil). Der Bot kann Stufen\n"..
|
||||
"überwinden (einen Block hoch/runter).\n"..
|
||||
"Es gibt aber auch Befehle\\, um den Bot nach oben und unten zu bewegen.\n"..
|
||||
"\n"..
|
||||
"Es ist nicht notwendig\\, einen Weg zurück zur Box zu markieren. Mit dem\n"..
|
||||
"Befehl „turn_off“ schaltet sich der Bot ab und ist von jeder Position aus wieder\n"..
|
||||
"in seiner Box. Das Gleiche gilt\\, wenn du den Bot über das Box-Menü ausschaltest.\n"..
|
||||
"Wenn der Bot ein Schild aus der falschen Richtung (von hinten oder von der Seite)\n"..
|
||||
"erreicht\\, wird das Schild ignoriert.\n"..
|
||||
"Der Bot wird einfach über das Schild steigen.\n"..
|
||||
"\n"..
|
||||
"Alle vordefinierten Schilder verfügen über ein Menü mit einer Liste der Bot-Befehle.\n"..
|
||||
"Diese Schilder können nicht geändert werden\\, aber du kannst deine eigenen Schilder\n"..
|
||||
"erstellen und programmieren. Hierzu musst du das „command“-Schild verwenden.\n"..
|
||||
"Dieses Schild verfügt über ein Bearbeitungsfeld für Befehle und eine Hilfeseite mit\n"..
|
||||
"allen verfügbaren Befehlen. Die Hilfeseite verfügt über eine Kopierschaltfläche\\,\n"..
|
||||
"um die Programmierung zu vereinfachen.\n"..
|
||||
"\n"..
|
||||
"Auch für die eigenen Schilder ist es wichtig zu wissen: Nach der Ausführung des\n"..
|
||||
"letzten Befehls des Schildes verfällt der Bot wieder in sein Standardverhalten\n"..
|
||||
"und läuft in die eingeschlagene Richtung.\n"..
|
||||
"\n"..
|
||||
"Eine Standardaufgabe des Bots besteht darin\\, Gegenstände von einer Truhe zu\n"..
|
||||
"einer anderen Truhe (oder einem Block mit einem truhenähnlichen Inventar) zu\n"..
|
||||
"verschieben. Dies kann über die beiden Zeichen „Nehme Gegenstand“ und\n"..
|
||||
"„Lege Gegenstand“ erfolgen.\n"..
|
||||
"Diese Schilder müssen auf dem Truhenblock platziert werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Zusätzlich zu den Schildern kann der Bot mittels Sensoren gesteuert werden. Sensoren wie der Bot-Sensor haben zwei Zustände: ein und aus. Wenn der Bot-Sensor einen Bot erkennt\\, wechselt er in den Zustand „Ein“ und sendet ein Signal an einen angeschlossenen Block\\, einen sogenannten Aktor.\n"..
|
||||
"\n"..
|
||||
"Sensoren sind:\n"..
|
||||
"\n"..
|
||||
" - Bot-Sensor: Sendet ein Signal\\, wenn ein Roboter am Sensor vorbeikommt\n"..
|
||||
" - Block Sensor: Sendet ein Signal\\, wenn der Sensor einen (neuen) Block erkennt\n"..
|
||||
" - Ernte Sensor: Sendet ein Signal\\, wenn beispielsweise Weizen ausgewachsen ist\n"..
|
||||
" - Signs Bot Kiste: Sendet je nach Truhenzustand (leer\\, voll) ein Signal\n"..
|
||||
"\n"..
|
||||
"Aktuatoren sind:\n"..
|
||||
"\n"..
|
||||
" - Roboter Box: Kann den Bot ein- und ausschalten\n"..
|
||||
" - Roboter Steuerungseinheit: Kann verwendet werden\\, um ein Schild auszutauschen\\,\num dadurch den Bot zu lenken\n"..
|
||||
"\n"..
|
||||
"Sensoren müssen mit Aktoren verbunden (gepaart) werden. Dafür kann das\n"..
|
||||
"„Sensor Verbindungswerkzeug“ genutzt werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Um ein Signal von einem Sensor an einen Aktor zu senden\\, muss der Sensor mit dem\n"..
|
||||
"Aktor verbunden (gepaart) werden. Zur Verbindung von Sensor und Aktor muss das\n"..
|
||||
"Sensor Connection Tool verwendet werden. Klicke einfach mit dem Werkzeug\n"..
|
||||
"auf beide Blöcke und der Sensor wird mit dem Aktor verbunden. Eine erfolgreiche\n"..
|
||||
"Verbindung wird durch ein Ping/Pong-Geräusch angezeigt.\n"..
|
||||
"\n"..
|
||||
"Bevor du den Sensor mit dem Aktor verbindest\\, stelle sicher\\, dass sich der Aktor im\n"..
|
||||
"gewünschten Zustand befindet.\n"..
|
||||
"Beispiel: Wenn du den Bot mit einem Sensor starten möchtest\\, verbinde den Sensor\n"..
|
||||
"mit der Bot Box\\, wenn sich der Bot im Status „An“ befindet. Andernfalls stoppt das\n"..
|
||||
"Sensorsignal den Bot\\, anstatt ihn zu starten.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Das Folgende gilt für alle Befehle\\, die Gegenstände/Artikel in das Bot-Inventar\n"..
|
||||
"legen\\, wie:\n"..
|
||||
"\n"..
|
||||
" - 'take_item <num> <slot>'\n"..
|
||||
" - 'pickup_items <slot>'\n"..
|
||||
" - 'trash_sign <slot>'\n"..
|
||||
" - 'harvest <slot>'\n"..
|
||||
" - 'dig_front <slot> <lvl>'\n"..
|
||||
"\n"..
|
||||
"Wenn beim Befehl kein Slot oder aber Slot 0 angegeben wurde (Fall A)\\, werden\n"..
|
||||
"nacheinander alle 8 Slots des Bot-Inventars überprüft. \n"..
|
||||
"Wenn ein Slot angegeben wurde (Fall B)\\, wird nur dieser Slot überprüft.\n"..
|
||||
"In beiden Fällen gilt: \n"..
|
||||
"\n"..
|
||||
"Wenn der Slot vorkonfiguriert ist und zum Artikel passt\\, oder wenn der Slot\n"..
|
||||
"nicht konfiguriert und leer ist\\, oder nur teilweise mit dem Artikeltyp gefüllt ist\\,\n"..
|
||||
"der hinzugefügt werden soll\\, dann werden die oder der Artikel hinzugefügt.\n"..
|
||||
"\n"..
|
||||
"Können nicht alle Artikel hinzugefügt werden\\, werden im Fall A die verbleibenden\n"..
|
||||
"Slots durchprobiert. Alles\\, was nicht zum eigenen Inventar hinzugefügt werden\n"..
|
||||
"konnte\\, geht zurück oder wird fallen gelassen.\n"..
|
||||
"\n"..
|
||||
"Das Folgende gilt für alle Befehle\\, die verwendet werden\\, um Gegenstände aus dem\n"..
|
||||
"Bot-Inventar zu entnehmen\\, wie zum Beispiel:\n"..
|
||||
"\n"..
|
||||
" - 'add_item <num> <slot>'\n"..
|
||||
"\n"..
|
||||
"Hier spielt es keine Rolle\\, ob ein Slot vorkonfiguriert ist oder nicht. Der Bot nimmt\n"..
|
||||
"den ersten Stapel\\, den er aus seinem eigenen Inventar finden kann\\, und versucht\\,\n"..
|
||||
"ihn zu verwenden. Wenn ein Slot angegeben ist\\, nimmt er Artikel nur aus diesem\n"..
|
||||
"Slot. Ist kein Slot angegeben\\, prüft der Bot nacheinander alle Positiionen\\,\n"..
|
||||
"beginnend bei Slot 1\\, bis es etwas findet. Ist die gefundene Anzahl kleiner als\n"..
|
||||
"gefordert\\, versucht er\\, den Rest aus einem beliebigen anderen Slot zu entnehmen.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"",
|
||||
"Die Box ist das Gehäuse des Bots. Platzieren Sie die Box und starten Sie den Bot über\n"..
|
||||
"die Schaltfläche „An“. Wenn die Mod Techage installiert ist\\, benötigt der Bot auch Strom.\n"..
|
||||
"Der Bot verlässt die Box auf der rechten Seite. Es startet nicht\\, wenn diese Position\n"..
|
||||
"blockiert ist.\n"..
|
||||
"\n"..
|
||||
"Um den Bot anzuhalten und zu entfernen\\, drücken Sie die „Aus“-Taste.\n"..
|
||||
"Das Box-Inventar simuliert das Inventar des Bots.\n"..
|
||||
"Sie können nicht auf das Inventar zugreifen\\, wenn der Bot aktiv ist..\n"..
|
||||
"Der Bot kann bis zu 8 Stapel mit Gengeständen und 6 Schilder mit sich führen.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Klappe ist ein einfacher Block\\, der als Tür für den Bot dient. Platziere die\n"..
|
||||
"Klappe in einer beliebigen Wand und der Bot öffnet und schließt die Klappe \n"..
|
||||
"automatisch\\, wenn er an dieser Stelle durch die Wand geht.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit dem Kopierer können Schilderkopien erstellt werden:\n"..
|
||||
"\n"..
|
||||
" - Fügen Sie ein „cmnd“-Schild\\, das als Vorlage verwendet werden soll\\, \n in das Inventar „Vorlage“ ein\n"..
|
||||
" - Fügen Sie ein oder mehrere „Leerzeichen“ zum Inventar „Eingabe“ hinzu.\n"..
|
||||
" - Nehmen Sie die Kopien aus dem Inventar „Ausgabe“.\n"..
|
||||
"\n"..
|
||||
"Alternativ können auch geschriebene Bücher \\[default:book_written\\] als\n"..
|
||||
"Vorlage verwendet werden.\n"..
|
||||
"Auch bereits geschriebene Schilder können als Input verwendet werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Bot-Sensor erkennt jeden Bot und sendet ein Signal\\, wenn sich ein Bot\n"..
|
||||
"in der Nähe befindet.\n"..
|
||||
"Der Sensorbereich beträgt einen Block/Meter. \n"..
|
||||
"Die Sensorrichtung spielt keine Rolle.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Block Sensor sendet zyklisch Signale\\, wenn er das Auftauchen oder\n"..
|
||||
"Verschwinden von Blöcken erkennt\\, muss aber entsprechend konfiguriert\n"..
|
||||
"werden. Die Sensorreichweite beträgt 3 Blöcke/Meter in eine Richtung.\n"..
|
||||
"Der Sensor hat eine aktive Seite (rot)\\, die auf den beobachteten Bereich\n"..
|
||||
"zeigen muss.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Ernte Sensor sendet zyklische Signale\\, wenn beispielsweise Weizen\n"..
|
||||
"ausgewachsen ist. Der Sensorbereich beträgt einen Block/Meter.#\n"..
|
||||
"Der Sensor hat eine aktive Seite (rot)\\, die auf die Ernte/das Feld\n"..
|
||||
"zeigen muss.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Signs Bot Kiste ist eine spezielle Truhe mit Sensorfunktion. Sie sendet\n"..
|
||||
"je nach Zustand ein Signal.\n"..
|
||||
"Mögliche Zustände sind „empty“\\, „not empty“\\, „almost full“.\n"..
|
||||
"\n"..
|
||||
"Ein typischer Anwendungsfall ist das Ausschalten des Bots\\, wenn die Truhe\n"..
|
||||
"fast voll oder aber leer ist.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Dies ist eine besondere Typ von Sensor. Er ist programmierbar mit einer Zeit\n"..
|
||||
"in Sekunden\\, z.B. um den Bot zyklisch zu starten.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Roboter Steuerungseinheit dient der Steuerung des Bots mittels Zeichen.\n"..
|
||||
"Das Gerät kann mit bis zu 4 verschiedenen Schildern bestückt und mittels\n"..
|
||||
"Sensoren programmiert werden.\n"..
|
||||
"\n"..
|
||||
"Um die Steuerungseinheit zu laden\\, platzieren Sie ein Schild auf der roten Seite\n"..
|
||||
"der Steuerungseinheit und klicken Sie auf die Steuerungseinheit.\n"..
|
||||
"Das Schild verschwindet / wird in das Inventar der Steuerungseinheit verschoben.\n"..
|
||||
"Dies kann dreimal wiederholt werden.\n"..
|
||||
"\n"..
|
||||
"Verwenden Sie das Verbindungstool\\, um bis zu 4 Sensoren mit der\n"..
|
||||
"Steuerungseinheit zu verbinden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit der Sensor Erweiterung können Sensorsignale an mehr als einen Aktor\n"..
|
||||
"gesendet werden.\n"..
|
||||
"Platzieren Sie eine oder mehrere Sensor Erweiterungen in der Nähe des\n"..
|
||||
"Sensors und verbinden Sie jede Sensor Erweiterung mithilfe des\n"..
|
||||
"Verbindungswerkzeug mit einem weiteren Aktor.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Signal wird gesendet\\, wenn alle Eingangssignale empfangen wurden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Signale werden verzögert weitergeleitet. Nachfolgende Signale werden\n"..
|
||||
"in die Warteschlange gestellt.\n"..
|
||||
"Die Verzögerungszeit ist konfigurierbar.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Wird zum Ernten und Säen eines 3x3-Feldes verwendet. Platziere das Schild\n"..
|
||||
"vor dem Feld.\n"..
|
||||
"Der verwendete Samen muss sich im ersten Slot des Bot Inventars\n"..
|
||||
"befinden. Wenn der Bot fertig ist\\, dreht sich der Bot und läuft zurück.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Wird verwendet\\, um eine Kopie eines 3x3x3-Würfels zu erstellen. Platziere das\n"..
|
||||
"Schild vor die zu kopierenden Blöcke. Verwende das Kopierzeichen\\, um die Kopie\n"..
|
||||
"dieser Blöcke an einem anderen Ort anzufertigen. \n"..
|
||||
"Der Bot muss zuerst das \"Vorlage\" Zeichen abarbeiten\\, erst dann kann der Bot zum\n"..
|
||||
"Kopierzeichen geleitet werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Wird verwendet\\, um eine Kopie eines 3x3x3-Würfels zu erstellen. Platziere das Schild\n"..
|
||||
"vor der Stelle\\, an der die Kopie angefertigt werden soll. Siehe auch \"Vorlage\" Zeichen.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Wird zum Schneiden von Blumen auf einem 3x3-Feld verwendet. Platziere das SWenn der Bot fertig ist\\, dreht sich der Bot und geht zurück.child\n"..
|
||||
"vor dem Feld.\n"..
|
||||
"Wenn der Bot fertig ist\\, dreht er sich um.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Wird zum Ernten eines Espen- oder Kiefernstamms verwendet:\n"..
|
||||
"\n"..
|
||||
" - Platziere das Schild vor dem Baum.\n"..
|
||||
" - Platziere eine Truhe rechts neben dem Schild.\n"..
|
||||
" - Legen Sie einen Erdstapel (mindestens 10 Blöcke) in die Truhe.\n"..
|
||||
" - Slot 1 des Bot-Inventars für Erde vorkonfigurieren\n"..
|
||||
" - Slot 2 des Bot-Inventars für Setzlingen vorkonfigurieren\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Das „Kommando“-Zeichen kann vom Spieler programmiert werden. Platziere\n"..
|
||||
"das Schild und verwende das Blockmenü\\, um die Abfolge von Bot-Befehlen zu\n"..
|
||||
"programmieren.\n"..
|
||||
"Das Menü verfügt über ein Bearbeitungsfeld für Ihre Befehle und eine Hilfeseite\n"..
|
||||
"mit allen verfügbaren Befehle. Die Hilfeseite verfügt über eine Kopierschaltfläche\\,\n"..
|
||||
"um die Programmierung zu vereinfachen.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Bot dreht sich nach rechts\\, wenn er dieses Schild vor sich erkennt.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Bot dreht sich nach links\\, wenn er dieses Schild vor sich erkennt.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Bot nimmt Gegenstände aus einer Truhe/Kiste vor sich und dreht sich dann um.\n"..
|
||||
"Dieses Schild muss oben auf der Truhe angebracht werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Bot legt Gegenstände in eine Truhe /Kistevor sich und dreht sich dann um.\n"..
|
||||
"Dieses Schild muss oben auf der Truhe angebracht werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Bot bleibt vor diesem Schild stehen\\, bis das Schild entfernt oder der\n"..
|
||||
"Bot ausgeschaltet wird.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Bot legt Gegenstände in einen Grubenwagen (minecart) vor sich\\,\n"..
|
||||
"schiebt den Wagen an und dreht sich dann um. Dieses Schild muss an\n"..
|
||||
"der Endposition des Wagens über der Schiene angebracht werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Bot nimmt Gegenstände aus einem Grubenwagen (minecart) vor sich\\,\n"..
|
||||
"schiebt den Wagen an und dreht sich dann um. Dieses Schild muss an der\n"..
|
||||
"Endposition des Wagens über der Schiene angebracht werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Wird verwendet\\, um Wasser in einen Eimer zu füllen. Platzieren Sie das Schild\n"..
|
||||
"am Ufer vor dem stillen Wasserbecken.\n"..
|
||||
"\n"..
|
||||
"Gegenstände in den Slots:\n"..
|
||||
"\n"..
|
||||
" 1 - leerer Eimer\n"..
|
||||
"\n"..
|
||||
"Das Ergebnis ist ein Eimer mit Wasser im ausgewählten Inventarplatz.\n"..
|
||||
"Wenn der Bot fertig ist\\, dreht er sich um.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Wird zum Kochen einer Gemüsesuppe im Kessel verwendet. \n"..
|
||||
"Der Kessel sollte leer und über brennbarem Material platziert sein. \n"..
|
||||
"Im zu verhindern\\, dass das Holzschild Feuer fängt\\, stelle das Schild\n"..
|
||||
"ein Feld vor den Kessel.\n"..
|
||||
"\n"..
|
||||
"Gegenstände in den Slots:\n"..
|
||||
"\n"..
|
||||
" 1 - Wassereimer\"\n"..
|
||||
" 2 – Gemüse Nr. 1 (z. B. Tomate)\n"..
|
||||
" 3 – Gemüse Nr. 2 (z. B. Karotte)\n"..
|
||||
" 4 – leere Schüssel (von Farming- oder Xdecor-Mods)\n"..
|
||||
"\n"..
|
||||
"Das Ergebnis ist eine Schüssel mit Gemüsesuppe im ausgewählten Inventarplatz.\n"..
|
||||
"Wenn der Bot fertig ist\\, dreht er sich um.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Befehle sind auch alle als Hilfeseite im Zeichen „Kommandos“ beschrieben.\n"..
|
||||
"Alle gesetzten Blöcke oder Schilder werden aus dem Bot-Inventar übernommen.\n"..
|
||||
"Alle entfernten Blöcke oder Schilder werden wieder dem Bot-Inventar hinzugefügt.\n"..
|
||||
"„<slot>“ ist immer der interne Inventarstapel des Bots (1..8).\n"..
|
||||
"\n"..
|
||||
" move <steps> - gehe einen oder mehrere Schritte vorwärts\n"..
|
||||
" cond_move - gehe bis zum nächsten Hindernis oder Schild\n"..
|
||||
" turn_left - drehe links\n"..
|
||||
" turn_right - drehe rechts\n"..
|
||||
" turn_around - drehe um\n"..
|
||||
" backward - gehe ein Schitt zurück\n"..
|
||||
" turn_off - schalte den Bot aus / zurück in die Box\n"..
|
||||
" pause <sec> - warte eine oder mehrere Sekunden\n"..
|
||||
" move_up - nach oben bewegen (maximal 2 Mal)\n"..
|
||||
" move_down - nach unten bewegen\n"..
|
||||
" fall_down - in ein Loch/Abgrund fallen lassen (bis zu 10 Blöcke)\n"..
|
||||
" take_item <num> <slot> - nehme einen oder mehrere Gegenstände aus einer Kiste\n"..
|
||||
" add_item <num> <slot> - lege einen oder mehrere Gegenstände in eine Kiste\n"..
|
||||
" add_fuel <num> <slot> - fülle Brennstoff in einen Ofen\n"..
|
||||
" place_front <slot> <lvl> - setze den Block vor den Roboter\n"..
|
||||
" place_left <slot> <lvl> - setze den Block links vom Roboter\n"..
|
||||
" place_right <slot> <lvl> - setze den Block rechts vom Roboter\n"..
|
||||
" place_below <slot> - hebe den Roboter an und setze den Block unter den Roboter\n"..
|
||||
" place_above <slot> - setze den Block über den Roboter\n"..
|
||||
" dig_front <slot> <lvl> - entferne den Block vor dem Roboter\n"..
|
||||
" dig_left <slot> <lvl> - entferne den Block links vom Roboter\n"..
|
||||
" dig_right <slot> <lvl> - entferne den Block rechts vom Roboter\n"..
|
||||
" dig_below <slot> - entferne den Block unter dem Roboter\n"..
|
||||
" dig_above <slot> - entferne den Block über dem Roboter\n"..
|
||||
" rotate_item <lvl> <steps> - drehe einen Block vor dem Roboter\n"..
|
||||
" set_param2 <lvl> <param2> - setze param2 des Blocks vor dem Roboter\n"..
|
||||
" place_sign <slot> - setze das Schild vor den Roboter\n"..
|
||||
" place_sign_behind <slot> - setze das Schild hinter den Roboter\n"..
|
||||
" dig_sign <slot> - entferne das Schild vor den Roboter\n"..
|
||||
" trash_sign <slot> - Entferne das Schild\\, lösche die Daten und fügen es dem Inventar hinzu\n"..
|
||||
" stop - stoppe den Bot\\, bis das Schild entfernt wird\n"..
|
||||
" pickup_items <slot> - hebe Gegenstände auf (in einem 3x3 Feld)\n"..
|
||||
" drop_items <num> <slot> - lasse Gegenstände fallen\n"..
|
||||
" harvest - ernte ein 3x3 Feld ab (farming)\n"..
|
||||
" cutting - schneide Blumen in einem 3x3 Feld ab\n"..
|
||||
" sow_seed <slot> - sähe/pflanze ein 3x3 Feld an\n"..
|
||||
" plant_sapling <slot> - pflanze einen Setzling vor dem Roboter\n"..
|
||||
" pattern - speichere die Blockeigenschaften hinter dem Schild (3x3x3 Würfel) als Vorlage\n"..
|
||||
" copy <size> - erstelle eine 3x3x3-Kopie der gespeicherten Vorlage\n"..
|
||||
" punch_cart - stoße einen Grubenwagen an\n"..
|
||||
" add_compost <slot> - gebe 2 Blätter in das Kompostfass\n"..
|
||||
" take_compost <slot> - nehme Kompost aus dem Kompostfass\n"..
|
||||
" print <text> - gebe eine Chat-Nachricht für Debug-Zwecke aus\n"..
|
||||
" take_water <slot> - schöpfe Wasser mit einem leeren Eimer\n"..
|
||||
" fill_cauldron <slot> - fülle den xdecor Kessel für eine Suppe\n"..
|
||||
" take_soup <slot> - fülle die kochende Suppe aus dem Kessel in eine leere Schüssel\n"..
|
||||
" flame_on - mache Feuer an\n"..
|
||||
" flame_off - lösche das Feuer\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
" ignite - Zünde den Techage-Kohleanzünder an\n"..
|
||||
" low_batt <percent> - Schalte den Bot aus\\, wenn die Batterieleistung\n"..
|
||||
" unter dem angegebenen Wert in Prozent (1..99) liegt.\n"..
|
||||
" jump_low_batt <percent> <label> - Springe zu <label>\\, wenn die Batterieleistung\n"..
|
||||
" unter dem angegebenen Wert in Prozent (1..99) liegt.\n"..
|
||||
" (siehe \"Flow Control Kommandos\")\n"..
|
||||
" send_cmnd <receiver> <command> - Sende ein Techage-Befehl an einen bestimmten Knoten.\n"..
|
||||
" Der Empfänger wird über die Techage-Knotennummer angesprochen.\n"..
|
||||
" Für Befehle mit zwei oder mehr Wörtern:\n"..
|
||||
" Verwenden Sie das Zeichen „*“ statt Leerzeichen\\, z.B.:\n"..
|
||||
" send_cmnd 3465 pull*default:dirt*2\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
" -- Sprungbefehl\\, <label> ist ein Wort aus den Zeichen a-z oder A-Z\n"..
|
||||
" jump <label>\n"..
|
||||
" \n"..
|
||||
" -- Sprungmarke / Beginn einer Funktion\n"..
|
||||
" <label>:\n"..
|
||||
" \n"..
|
||||
" -- Rückkehr von einer Funktion\n"..
|
||||
" return\n"..
|
||||
" \n"..
|
||||
" -- Beginn eines Schleifenblocks\\, <num> ist eine Zahl von 1..999\n"..
|
||||
" repeat <num>\n"..
|
||||
" \n"..
|
||||
" -- Ende eines Schleifenblocks\n"..
|
||||
" end\n"..
|
||||
" \n"..
|
||||
" -- Aufruf einer Funktion (mit Rückkehr über den Befehl 'return')\n"..
|
||||
" call <label>\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
" -- Überprüfe\\, ob sich <num> Gegenstände im \n"..
|
||||
" -- truhenähnlichen Knoten befinden.\n"..
|
||||
" -- Wenn nicht\\, springe zu <label>.\n"..
|
||||
" -- <slot> ist der Bot-Inventar-Slot (1..8) um den Artikel anzugeben\\, \n"..
|
||||
" -- oder 0 für jeden Artikel.\n"..
|
||||
" jump_check_item <num> <slot> <label>\n"..
|
||||
" \n"..
|
||||
" -- Siehe \"Techage spezifische Kommandos\"\n"..
|
||||
" jump_low_batt <percent> <label>\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"",
|
||||
" -- jump to the label 'main'\n"..
|
||||
" jump main\n"..
|
||||
" \n"..
|
||||
" -- starting point of the function with the name 'foo'\n"..
|
||||
" foo:\n"..
|
||||
" cmnd ...\n"..
|
||||
" cmnd ...\n"..
|
||||
" -- end of 'foo'. Jump back\n"..
|
||||
" return\n"..
|
||||
" \n"..
|
||||
" -- main program\n"..
|
||||
" main:\n"..
|
||||
" cmnd ...\n"..
|
||||
" -- repeat all commands up to 'end' 10 times\n"..
|
||||
" repeat 10\n"..
|
||||
" cmnd ...\n"..
|
||||
" -- call the subfunction 'foo'\n"..
|
||||
" call foo\n"..
|
||||
" cmnd ...\n"..
|
||||
" -- end of the 'repeat' loop\n"..
|
||||
" end\n"..
|
||||
" -- end of the program\n"..
|
||||
" exit\n"..
|
||||
"\n",
|
||||
" cmnd ...\n"..
|
||||
" -- repeat all commands up to 'end' 10 times\n"..
|
||||
" repeat 10\n"..
|
||||
" cmnd ...\n"..
|
||||
" -- call the subfunction 'foo'\n"..
|
||||
" call foo\n"..
|
||||
" cmnd ...\n"..
|
||||
" -- end of the 'repeat' loop\n"..
|
||||
" end\n"..
|
||||
" -- end of the program\n"..
|
||||
" exit\n"..
|
||||
" \n"..
|
||||
" -- starting point of the function with the name 'foo'\n"..
|
||||
" foo:\n"..
|
||||
" cmnd ...\n"..
|
||||
" cmnd ...\n"..
|
||||
" -- end of 'foo'. Jump back\n"..
|
||||
" return\n"..
|
||||
"\n",
|
||||
},
|
||||
images = {
|
||||
"signs_bot_bot_inv.png",
|
||||
"signs_bot_bot_inv.png",
|
||||
"signs_bot_sign_left.png",
|
||||
"signs_bot_sensor_crop_inv.png",
|
||||
"signs_bot_tool.png",
|
||||
"signs_bot:box",
|
||||
"",
|
||||
"signs_bot:box",
|
||||
"signs_bot:bot_flap",
|
||||
"signs_bot:duplicator",
|
||||
"signs_bot:bot_sensor",
|
||||
"signs_bot:node_sensor",
|
||||
"signs_bot:crop_sensor",
|
||||
"signs_bot:chest",
|
||||
"signs_bot:timer",
|
||||
"signs_bot:changer1",
|
||||
"signs_bot:sensor_extender",
|
||||
"signs_bot:and1",
|
||||
"signs_bot:delayer",
|
||||
"signs_bot:farming",
|
||||
"signs_bot:pattern",
|
||||
"signs_bot:copy3x3x3",
|
||||
"signs_bot:flowers",
|
||||
"signs_bot:aspen",
|
||||
"signs_bot:sign_cmnd",
|
||||
"signs_bot:sign_right",
|
||||
"signs_bot:sign_left",
|
||||
"signs_bot:sign_take",
|
||||
"signs_bot:sign_add",
|
||||
"signs_bot:sign_stop",
|
||||
"signs_bot:sign_add_cart",
|
||||
"signs_bot:sign_take_cart",
|
||||
"signs_bot:water",
|
||||
"signs_bot:soup",
|
||||
"signs_bot_bot_inv.png",
|
||||
"signs_bot_bot_inv.png",
|
||||
"signs_bot_bot_inv.png",
|
||||
"signs_bot_bot_inv.png",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
},
|
||||
plans = {
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
}
|
||||
}
|
578
signs_bot/manual_DE.md
Normal file
@ -0,0 +1,578 @@
|
||||
# Signs Bot
|
||||
|
||||
Ein durch Zeichen/Schilder gesteuerter Roboter.
|
||||
|
||||
Web Doku: https://github.com/joe7575/signs_bot/blob/master/manual_DE.md
|
||||
|
||||
[signs_bot_bot_inv.png|image]
|
||||
|
||||
## Erste Schritte
|
||||
|
||||
Nachdem du die Signs Bot Box platziert hast, kannst du den Bot über die
|
||||
Schaltfläche „An“ im Boxmenü starten. Wenn der Bot sofort in seine Box zurückkehrt,
|
||||
muss der Bot zuerst mit elektrischer Energie (Techage) aufgeladen werden.
|
||||
Anschließend läuft der Bot geradeaus, bis er auf ein Hindernis trifft
|
||||
(eine Stufe mit zwei oder mehr Blöcken nach oben oder unten, oder ein Schild.)
|
||||
|
||||
Der Bot kann nur durch Schilder gesteuert werden, die ihm in den Weg gestellt werden.
|
||||
|
||||
Falls der Bot ein Schild erreicht, führt er die Befehle auf dem Schild aus.
|
||||
Falls der erste Befehl auf dem Schild z.B. lautet: „turn_around“, dreht sich der Bot
|
||||
um und geht zurück. In diesem Fall erreicht der Bot seine Box erneut und
|
||||
schaltet sich ab.
|
||||
|
||||
Falls der Bot ein Hindernis erreicht, stoppt er, oder führt, falls verfügbar,
|
||||
den nächsten Befehle vom letzten Schild aus.
|
||||
|
||||
Die Signs Bot Box verfügt über ein Inventar mit 6 Slots (Speicherplätze) für Schilder
|
||||
und 8 Slots für andere Gegenstände (die vom Bot platziert/abgebaut werden).
|
||||
Dieses Inventar simuliert das interne Inventar des Bots. Das bedeutet, dass du
|
||||
nur dann Zugriff auf das Inventar hast, wenn der Bot ausgeschaltet ist
|
||||
(in seiner Box „sitzt“).
|
||||
|
||||
Außerdem gibt es folgende Blöcke:
|
||||
- Sensoren: Diese können ein Signal an einen Aktor senden, wenn sie mit dem
|
||||
Aktor verbunden sind.
|
||||
- Aktoren: Diese führen eine Aktion aus, wenn sie ein Signal von einem Sensor empfangen.
|
||||
|
||||
[signs_bot_bot_inv.png|image]
|
||||
|
||||
## Schilder
|
||||
|
||||
Du steuerst die Richtung des Bots über die „links drehen“ und
|
||||
„rechts drehen“-Schilder (Schilder mit dem Pfeil). Der Bot kann Stufen
|
||||
überwinden (einen Block hoch/runter).
|
||||
Es gibt aber auch Befehle, um den Bot nach oben und unten zu bewegen.
|
||||
|
||||
Es ist nicht notwendig, einen Weg zurück zur Box zu markieren. Mit dem
|
||||
Befehl „turn_off“ schaltet sich der Bot ab und ist von jeder Position aus wieder
|
||||
in seiner Box. Das Gleiche gilt, wenn du den Bot über das Box-Menü ausschaltest.
|
||||
Wenn der Bot ein Schild aus der falschen Richtung (von hinten oder von der Seite)
|
||||
erreicht, wird das Schild ignoriert.
|
||||
Der Bot wird einfach über das Schild steigen.
|
||||
|
||||
Alle vordefinierten Schilder verfügen über ein Menü mit einer Liste der Bot-Befehle.
|
||||
Diese Schilder können nicht geändert werden, aber du kannst deine eigenen Schilder
|
||||
erstellen und programmieren. Hierzu musst du das „command“-Schild verwenden.
|
||||
Dieses Schild verfügt über ein Bearbeitungsfeld für Befehle und eine Hilfeseite mit
|
||||
allen verfügbaren Befehlen. Die Hilfeseite verfügt über eine Kopierschaltfläche,
|
||||
um die Programmierung zu vereinfachen.
|
||||
|
||||
Auch für die eigenen Schilder ist es wichtig zu wissen: Nach der Ausführung des
|
||||
letzten Befehls des Schildes verfällt der Bot wieder in sein Standardverhalten
|
||||
und läuft in die eingeschlagene Richtung.
|
||||
|
||||
Eine Standardaufgabe des Bots besteht darin, Gegenstände von einer Truhe zu
|
||||
einer anderen Truhe (oder einem Block mit einem truhenähnlichen Inventar) zu
|
||||
verschieben. Dies kann über die beiden Zeichen „Nehme Gegenstand“ und
|
||||
„Lege Gegenstand“ erfolgen.
|
||||
Diese Schilder müssen auf dem Truhenblock platziert werden.
|
||||
|
||||
[signs_bot_sign_left.png|image]
|
||||
|
||||
## Sensors and Actuators
|
||||
|
||||
Zusätzlich zu den Schildern kann der Bot mittels Sensoren gesteuert werden. Sensoren wie der Bot-Sensor haben zwei Zustände: ein und aus. Wenn der Bot-Sensor einen Bot erkennt, wechselt er in den Zustand „Ein“ und sendet ein Signal an einen angeschlossenen Block, einen sogenannten Aktor.
|
||||
|
||||
Sensoren sind:
|
||||
|
||||
- Bot-Sensor: Sendet ein Signal, wenn ein Roboter am Sensor vorbeikommt
|
||||
- Block Sensor: Sendet ein Signal, wenn der Sensor einen (neuen) Block erkennt
|
||||
- Ernte Sensor: Sendet ein Signal, wenn beispielsweise Weizen ausgewachsen ist
|
||||
- Signs Bot Kiste: Sendet je nach Truhenzustand (leer, voll) ein Signal
|
||||
|
||||
Aktuatoren sind:
|
||||
|
||||
- Roboter Box: Kann den Bot ein- und ausschalten
|
||||
- Roboter Steuerungseinheit: Kann verwendet werden, um ein Schild auszutauschen,
|
||||
um dadurch den Bot zu lenken
|
||||
|
||||
Sensoren müssen mit Aktoren verbunden (gepaart) werden. Dafür kann das
|
||||
„Sensor Verbindungswerkzeug“ genutzt werden.
|
||||
|
||||
[signs_bot_sensor_crop_inv.png|image]
|
||||
|
||||
|
||||
## Sensor Verbindungswerkzeug
|
||||
|
||||
Um ein Signal von einem Sensor an einen Aktor zu senden, muss der Sensor mit dem
|
||||
Aktor verbunden (gepaart) werden. Zur Verbindung von Sensor und Aktor muss das
|
||||
Sensor Connection Tool verwendet werden. Klicke einfach mit dem Werkzeug
|
||||
auf beide Blöcke und der Sensor wird mit dem Aktor verbunden. Eine erfolgreiche
|
||||
Verbindung wird durch ein Ping/Pong-Geräusch angezeigt.
|
||||
|
||||
Bevor du den Sensor mit dem Aktor verbindest, stelle sicher, dass sich der Aktor im
|
||||
gewünschten Zustand befindet.
|
||||
Beispiel: Wenn du den Bot mit einem Sensor starten möchtest, verbinde den Sensor
|
||||
mit der Bot Box, wenn sich der Bot im Status „An“ befindet. Andernfalls stoppt das
|
||||
Sensorsignal den Bot, anstatt ihn zu starten.
|
||||
|
||||
[signs_bot_tool.png|image]
|
||||
|
||||
|
||||
## Inventar
|
||||
|
||||
Das Folgende gilt für alle Befehle, die Gegenstände/Artikel in das Bot-Inventar
|
||||
legen, wie:
|
||||
|
||||
- `take_item <num> <slot>`
|
||||
- `pickup_items <slot>`
|
||||
- `trash_sign <slot>`
|
||||
- `harvest <slot>`
|
||||
- `dig_front <slot> <lvl>`
|
||||
|
||||
Wenn beim Befehl kein Slot oder aber Slot 0 angegeben wurde (Fall A), werden
|
||||
nacheinander alle 8 Slots des Bot-Inventars überprüft.
|
||||
Wenn ein Slot angegeben wurde (Fall B), wird nur dieser Slot überprüft.
|
||||
In beiden Fällen gilt:
|
||||
|
||||
Wenn der Slot vorkonfiguriert ist und zum Artikel passt, oder wenn der Slot
|
||||
nicht konfiguriert und leer ist, oder nur teilweise mit dem Artikeltyp gefüllt ist,
|
||||
der hinzugefügt werden soll, dann werden die oder der Artikel hinzugefügt.
|
||||
|
||||
Können nicht alle Artikel hinzugefügt werden, werden im Fall A die verbleibenden
|
||||
Slots durchprobiert. Alles, was nicht zum eigenen Inventar hinzugefügt werden
|
||||
konnte, geht zurück oder wird fallen gelassen.
|
||||
|
||||
Das Folgende gilt für alle Befehle, die verwendet werden, um Gegenstände aus dem
|
||||
Bot-Inventar zu entnehmen, wie zum Beispiel:
|
||||
|
||||
- `add_item <num> <slot>`
|
||||
|
||||
Hier spielt es keine Rolle, ob ein Slot vorkonfiguriert ist oder nicht. Der Bot nimmt
|
||||
den ersten Stapel, den er aus seinem eigenen Inventar finden kann, und versucht,
|
||||
ihn zu verwenden. Wenn ein Slot angegeben ist, nimmt er Artikel nur aus diesem
|
||||
Slot. Ist kein Slot angegeben, prüft der Bot nacheinander alle Positiionen,
|
||||
beginnend bei Slot 1, bis es etwas findet. Ist die gefundene Anzahl kleiner als
|
||||
gefordert, versucht er, den Rest aus einem beliebigen anderen Slot zu entnehmen.
|
||||
|
||||
[signs_bot:box|image]
|
||||
|
||||
## Blöcke
|
||||
|
||||
### Signs Bot Box
|
||||
|
||||
Die Box ist das Gehäuse des Bots. Platzieren Sie die Box und starten Sie den Bot über
|
||||
die Schaltfläche „An“. Wenn die Mod Techage installiert ist, benötigt der Bot auch Strom.
|
||||
Der Bot verlässt die Box auf der rechten Seite. Es startet nicht, wenn diese Position
|
||||
blockiert ist.
|
||||
|
||||
Um den Bot anzuhalten und zu entfernen, drücken Sie die „Aus“-Taste.
|
||||
Das Box-Inventar simuliert das Inventar des Bots.
|
||||
Sie können nicht auf das Inventar zugreifen, wenn der Bot aktiv ist..
|
||||
Der Bot kann bis zu 8 Stapel mit Gengeständen und 6 Schilder mit sich führen.
|
||||
|
||||
[signs_bot:box|image]
|
||||
|
||||
### Bot Klappe
|
||||
|
||||
Die Klappe ist ein einfacher Block, der als Tür für den Bot dient. Platziere die
|
||||
Klappe in einer beliebigen Wand und der Bot öffnet und schließt die Klappe
|
||||
automatisch, wenn er an dieser Stelle durch die Wand geht.
|
||||
|
||||
[signs_bot:bot_flap|image]
|
||||
|
||||
### Zeichen Kopierer
|
||||
|
||||
Mit dem Kopierer können Schilderkopien erstellt werden:
|
||||
|
||||
1. Fügen Sie ein „cmnd“-Schild, das als Vorlage verwendet werden soll,
|
||||
in das Inventar „Vorlage“ ein
|
||||
2. Fügen Sie ein oder mehrere „Leerzeichen“ zum Inventar „Eingabe“ hinzu.
|
||||
3. Nehmen Sie die Kopien aus dem Inventar „Ausgabe“.
|
||||
|
||||
Alternativ können auch geschriebene Bücher [default:book_written] als
|
||||
Vorlage verwendet werden.
|
||||
Auch bereits geschriebene Schilder können als Input verwendet werden.
|
||||
|
||||
[signs_bot:duplicator|image]
|
||||
|
||||
### Bot Sensor
|
||||
|
||||
Der Bot-Sensor erkennt jeden Bot und sendet ein Signal, wenn sich ein Bot
|
||||
in der Nähe befindet.
|
||||
Der Sensorbereich beträgt einen Block/Meter.
|
||||
Die Sensorrichtung spielt keine Rolle.
|
||||
|
||||
[signs_bot:bot_sensor|image]
|
||||
|
||||
### Block Sensor
|
||||
|
||||
Der Block Sensor sendet zyklisch Signale, wenn er das Auftauchen oder
|
||||
Verschwinden von Blöcken erkennt, muss aber entsprechend konfiguriert
|
||||
werden. Die Sensorreichweite beträgt 3 Blöcke/Meter in eine Richtung.
|
||||
Der Sensor hat eine aktive Seite (rot), die auf den beobachteten Bereich
|
||||
zeigen muss.
|
||||
|
||||
[signs_bot:node_sensor|image]
|
||||
|
||||
### Ernte Sensor
|
||||
|
||||
Der Ernte Sensor sendet zyklische Signale, wenn beispielsweise Weizen
|
||||
ausgewachsen ist. Der Sensorbereich beträgt einen Block/Meter.#
|
||||
Der Sensor hat eine aktive Seite (rot), die auf die Ernte/das Feld
|
||||
zeigen muss.
|
||||
|
||||
[signs_bot:crop_sensor|image]
|
||||
|
||||
### Signs Bot Kiste
|
||||
|
||||
Die Signs Bot Kiste ist eine spezielle Truhe mit Sensorfunktion. Sie sendet
|
||||
je nach Zustand ein Signal.
|
||||
Mögliche Zustände sind „empty“, „not empty“, „almost full“.
|
||||
|
||||
Ein typischer Anwendungsfall ist das Ausschalten des Bots, wenn die Truhe
|
||||
fast voll oder aber leer ist.
|
||||
|
||||
[signs_bot:chest|image]
|
||||
|
||||
### Bot Timer
|
||||
|
||||
Dies ist eine besondere Typ von Sensor. Er ist programmierbar mit einer Zeit
|
||||
in Sekunden, z.B. um den Bot zyklisch zu starten.
|
||||
|
||||
[signs_bot:timer|image]
|
||||
|
||||
### Roboter Steuerungseinheit
|
||||
|
||||
Die Roboter Steuerungseinheit dient der Steuerung des Bots mittels Zeichen.
|
||||
Das Gerät kann mit bis zu 4 verschiedenen Schildern bestückt und mittels
|
||||
Sensoren programmiert werden.
|
||||
|
||||
Um die Steuerungseinheit zu laden, platzieren Sie ein Schild auf der roten Seite
|
||||
der Steuerungseinheit und klicken Sie auf die Steuerungseinheit.
|
||||
Das Schild verschwindet / wird in das Inventar der Steuerungseinheit verschoben.
|
||||
Dies kann dreimal wiederholt werden.
|
||||
|
||||
Verwenden Sie das Verbindungstool, um bis zu 4 Sensoren mit der
|
||||
Steuerungseinheit zu verbinden.
|
||||
|
||||
[signs_bot:changer1|image]
|
||||
|
||||
### Sensor Erweiterung
|
||||
|
||||
Mit der Sensor Erweiterung können Sensorsignale an mehr als einen Aktor
|
||||
gesendet werden.
|
||||
Platzieren Sie eine oder mehrere Sensor Erweiterungen in der Nähe des
|
||||
Sensors und verbinden Sie jede Sensor Erweiterung mithilfe des
|
||||
Verbindungswerkzeug mit einem weiteren Aktor.
|
||||
|
||||
[signs_bot:sensor_extender|image]
|
||||
|
||||
### Signal AND
|
||||
|
||||
Signal wird gesendet, wenn alle Eingangssignale empfangen wurden.
|
||||
|
||||
[signs_bot:and1|image]
|
||||
|
||||
### Signal Verzögerer
|
||||
|
||||
Signale werden verzögert weitergeleitet. Nachfolgende Signale werden
|
||||
in die Warteschlange gestellt.
|
||||
Die Verzögerungszeit ist konfigurierbar.
|
||||
|
||||
[signs_bot:delayer|image]
|
||||
|
||||
### Zeichen 'Farming'
|
||||
|
||||
Wird zum Ernten und Säen eines 3x3-Feldes verwendet. Platziere das Schild
|
||||
vor dem Feld.
|
||||
Der verwendete Samen muss sich im ersten Slot des Bot Inventars
|
||||
befinden. Wenn der Bot fertig ist, dreht sich der Bot und läuft zurück.
|
||||
|
||||
[signs_bot:farming|image]
|
||||
|
||||
### Zeichen 'Vorlage'
|
||||
|
||||
Wird verwendet, um eine Kopie eines 3x3x3-Würfels zu erstellen. Platziere das
|
||||
Schild vor die zu kopierenden Blöcke. Verwende das Kopierzeichen, um die Kopie
|
||||
dieser Blöcke an einem anderen Ort anzufertigen.
|
||||
Der Bot muss zuerst das "Vorlage" Zeichen abarbeiten, erst dann kann der Bot zum
|
||||
Kopierzeichen geleitet werden.
|
||||
|
||||
[signs_bot:pattern|image]
|
||||
|
||||
### Zeichen 'kopiere 3x3x3'
|
||||
|
||||
Wird verwendet, um eine Kopie eines 3x3x3-Würfels zu erstellen. Platziere das Schild
|
||||
vor der Stelle, an der die Kopie angefertigt werden soll. Siehe auch "Vorlage" Zeichen.
|
||||
|
||||
[signs_bot:copy3x3x3|image]
|
||||
|
||||
### Zeichen 'Blumen'
|
||||
|
||||
Wird zum Schneiden von Blumen auf einem 3x3-Feld verwendet. Platziere das SWenn der Bot fertig ist, dreht sich der Bot und geht zurück.child
|
||||
vor dem Feld.
|
||||
Wenn der Bot fertig ist, dreht er sich um.
|
||||
|
||||
[signs_bot:flowers|image]
|
||||
|
||||
### Zeichen 'Espe'
|
||||
|
||||
Wird zum Ernten eines Espen- oder Kiefernstamms verwendet:
|
||||
|
||||
- Platziere das Schild vor dem Baum.
|
||||
- Platziere eine Truhe rechts neben dem Schild.
|
||||
- Legen Sie einen Erdstapel (mindestens 10 Blöcke) in die Truhe.
|
||||
- Slot 1 des Bot-Inventars für Erde vorkonfigurieren
|
||||
- Slot 2 des Bot-Inventars für Setzlingen vorkonfigurieren
|
||||
|
||||
[signs_bot:aspen|image]
|
||||
|
||||
### Zeichen 'Kommando'
|
||||
|
||||
Das „Kommando“-Zeichen kann vom Spieler programmiert werden. Platziere
|
||||
das Schild und verwende das Blockmenü, um die Abfolge von Bot-Befehlen zu
|
||||
programmieren.
|
||||
Das Menü verfügt über ein Bearbeitungsfeld für Ihre Befehle und eine Hilfeseite
|
||||
mit allen verfügbaren Befehle. Die Hilfeseite verfügt über eine Kopierschaltfläche,
|
||||
um die Programmierung zu vereinfachen.
|
||||
|
||||
[signs_bot:sign_cmnd|image]
|
||||
|
||||
### Zeichen "Rechts drehen"
|
||||
|
||||
Der Bot dreht sich nach rechts, wenn er dieses Schild vor sich erkennt.
|
||||
|
||||
[signs_bot:sign_right|image]
|
||||
|
||||
### Zeichen "Links drehen"
|
||||
|
||||
Der Bot dreht sich nach links, wenn er dieses Schild vor sich erkennt.
|
||||
|
||||
[signs_bot:sign_left|image]
|
||||
|
||||
### Zeichen "Nehme Gegenstand"
|
||||
|
||||
Der Bot nimmt Gegenstände aus einer Truhe/Kiste vor sich und dreht sich dann um.
|
||||
Dieses Schild muss oben auf der Truhe angebracht werden.
|
||||
|
||||
|
||||
[signs_bot:sign_take|image]
|
||||
|
||||
### Zeichen "Lege Gegenstand"
|
||||
|
||||
Der Bot legt Gegenstände in eine Truhe /Kistevor sich und dreht sich dann um.
|
||||
Dieses Schild muss oben auf der Truhe angebracht werden.
|
||||
|
||||
[signs_bot:sign_add|image]
|
||||
|
||||
### Zeichen "Stopp"
|
||||
|
||||
Der Bot bleibt vor diesem Schild stehen, bis das Schild entfernt oder der
|
||||
Bot ausgeschaltet wird.
|
||||
|
||||
[signs_bot:sign_stop|image]
|
||||
|
||||
### Zeichen "Lege in den Wagen" (minecart)
|
||||
|
||||
Der Bot legt Gegenstände in einen Grubenwagen (minecart) vor sich,
|
||||
schiebt den Wagen an und dreht sich dann um. Dieses Schild muss an
|
||||
der Endposition des Wagens über der Schiene angebracht werden.
|
||||
|
||||
[signs_bot:sign_add_cart|image]
|
||||
|
||||
### Zeichen "Nehme aus dem Wagen" (minecart)
|
||||
|
||||
Der Bot nimmt Gegenstände aus einem Grubenwagen (minecart) vor sich,
|
||||
schiebt den Wagen an und dreht sich dann um. Dieses Schild muss an der
|
||||
Endposition des Wagens über der Schiene angebracht werden.
|
||||
|
||||
[signs_bot:sign_take_cart|image]
|
||||
|
||||
### Zeichen 'Schöpfe Wasser' (xdecor)
|
||||
|
||||
Wird verwendet, um Wasser in einen Eimer zu füllen. Platzieren Sie das Schild
|
||||
am Ufer vor dem stillen Wasserbecken.
|
||||
|
||||
Gegenstände in den Slots:
|
||||
|
||||
1 - leerer Eimer
|
||||
|
||||
Das Ergebnis ist ein Eimer mit Wasser im ausgewählten Inventarplatz.
|
||||
Wenn der Bot fertig ist, dreht er sich um.
|
||||
|
||||
[signs_bot:water|image]
|
||||
|
||||
### Zeichen 'Koche Suppe' (xdecor)
|
||||
|
||||
Wird zum Kochen einer Gemüsesuppe im Kessel verwendet.
|
||||
Der Kessel sollte leer und über brennbarem Material platziert sein.
|
||||
Im zu verhindern, dass das Holzschild Feuer fängt, stelle das Schild
|
||||
ein Feld vor den Kessel.
|
||||
|
||||
Gegenstände in den Slots:
|
||||
|
||||
1 - Wassereimer"
|
||||
2 – Gemüse Nr. 1 (z. B. Tomate)
|
||||
3 – Gemüse Nr. 2 (z. B. Karotte)
|
||||
4 – leere Schüssel (von Farming- oder Xdecor-Mods)
|
||||
|
||||
Das Ergebnis ist eine Schüssel mit Gemüsesuppe im ausgewählten Inventarplatz.
|
||||
Wenn der Bot fertig ist, dreht er sich um.
|
||||
|
||||
|
||||
[signs_bot:soup|image]
|
||||
|
||||
|
||||
## Bot Kommandos
|
||||
|
||||
Die Befehle sind auch alle als Hilfeseite im Zeichen „Kommandos“ beschrieben.
|
||||
Alle gesetzten Blöcke oder Schilder werden aus dem Bot-Inventar übernommen.
|
||||
Alle entfernten Blöcke oder Schilder werden wieder dem Bot-Inventar hinzugefügt.
|
||||
„<slot>“ ist immer der interne Inventarstapel des Bots (1..8).
|
||||
|
||||
move <steps> - gehe einen oder mehrere Schritte vorwärts
|
||||
cond_move - gehe bis zum nächsten Hindernis oder Schild
|
||||
turn_left - drehe links
|
||||
turn_right - drehe rechts
|
||||
turn_around - drehe um
|
||||
backward - gehe ein Schitt zurück
|
||||
turn_off - schalte den Bot aus / zurück in die Box
|
||||
pause <sec> - warte eine oder mehrere Sekunden
|
||||
move_up - nach oben bewegen (maximal 2 Mal)
|
||||
move_down - nach unten bewegen
|
||||
fall_down - in ein Loch/Abgrund fallen lassen (bis zu 10 Blöcke)
|
||||
take_item <num> <slot> - nehme einen oder mehrere Gegenstände aus einer Kiste
|
||||
add_item <num> <slot> - lege einen oder mehrere Gegenstände in eine Kiste
|
||||
add_fuel <num> <slot> - fülle Brennstoff in einen Ofen
|
||||
place_front <slot> <lvl> - setze den Block vor den Roboter
|
||||
place_left <slot> <lvl> - setze den Block links vom Roboter
|
||||
place_right <slot> <lvl> - setze den Block rechts vom Roboter
|
||||
place_below <slot> - hebe den Roboter an und setze den Block unter den Roboter
|
||||
place_above <slot> - setze den Block über den Roboter
|
||||
dig_front <slot> <lvl> - entferne den Block vor dem Roboter
|
||||
dig_left <slot> <lvl> - entferne den Block links vom Roboter
|
||||
dig_right <slot> <lvl> - entferne den Block rechts vom Roboter
|
||||
dig_below <slot> - entferne den Block unter dem Roboter
|
||||
dig_above <slot> - entferne den Block über dem Roboter
|
||||
rotate_item <lvl> <steps> - drehe einen Block vor dem Roboter
|
||||
set_param2 <lvl> <param2> - setze param2 des Blocks vor dem Roboter
|
||||
place_sign <slot> - setze das Schild vor den Roboter
|
||||
place_sign_behind <slot> - setze das Schild hinter den Roboter
|
||||
dig_sign <slot> - entferne das Schild vor den Roboter
|
||||
trash_sign <slot> - Entferne das Schild, lösche die Daten und fügen es dem Inventar hinzu
|
||||
stop - stoppe den Bot, bis das Schild entfernt wird
|
||||
pickup_items <slot> - hebe Gegenstände auf (in einem 3x3 Feld)
|
||||
drop_items <num> <slot> - lasse Gegenstände fallen
|
||||
harvest - ernte ein 3x3 Feld ab (farming)
|
||||
cutting - schneide Blumen in einem 3x3 Feld ab
|
||||
sow_seed <slot> - sähe/pflanze ein 3x3 Feld an
|
||||
plant_sapling <slot> - pflanze einen Setzling vor dem Roboter
|
||||
pattern - speichere die Blockeigenschaften hinter dem Schild (3x3x3 Würfel) als Vorlage
|
||||
copy <size> - erstelle eine 3x3x3-Kopie der gespeicherten Vorlage
|
||||
punch_cart - stoße einen Grubenwagen an
|
||||
add_compost <slot> - gebe 2 Blätter in das Kompostfass
|
||||
take_compost <slot> - nehme Kompost aus dem Kompostfass
|
||||
print <text> - gebe eine Chat-Nachricht für Debug-Zwecke aus
|
||||
take_water <slot> - schöpfe Wasser mit einem leeren Eimer
|
||||
fill_cauldron <slot> - fülle den xdecor Kessel für eine Suppe
|
||||
take_soup <slot> - fülle die kochende Suppe aus dem Kessel in eine leere Schüssel
|
||||
flame_on - mache Feuer an
|
||||
flame_off - lösche das Feuer
|
||||
|
||||
[signs_bot_bot_inv.png|image]
|
||||
|
||||
### Techage spezifische Kommandos
|
||||
|
||||
ignite - Zünde den Techage-Kohleanzünder an
|
||||
low_batt <percent> - Schalte den Bot aus, wenn die Batterieleistung
|
||||
unter dem angegebenen Wert in Prozent (1..99) liegt.
|
||||
jump_low_batt <percent> <label> - Springe zu <label>, wenn die Batterieleistung
|
||||
unter dem angegebenen Wert in Prozent (1..99) liegt.
|
||||
(siehe "Flow Control Kommandos")
|
||||
send_cmnd <receiver> <command> - Sende ein Techage-Befehl an einen bestimmten Knoten.
|
||||
Der Empfänger wird über die Techage-Knotennummer angesprochen.
|
||||
Für Befehle mit zwei oder mehr Wörtern:
|
||||
Verwenden Sie das Zeichen „*“ statt Leerzeichen, z.B.:
|
||||
send_cmnd 3465 pull*default:dirt*2
|
||||
|
||||
[signs_bot_bot_inv.png|image]
|
||||
|
||||
### Flow Control Kommandos
|
||||
|
||||
-- Sprungbefehl, <label> ist ein Wort aus den Zeichen a-z oder A-Z
|
||||
jump <label>
|
||||
|
||||
-- Sprungmarke / Beginn einer Funktion
|
||||
<label>:
|
||||
|
||||
-- Rückkehr von einer Funktion
|
||||
return
|
||||
|
||||
-- Beginn eines Schleifenblocks, <num> ist eine Zahl von 1..999
|
||||
repeat <num>
|
||||
|
||||
-- Ende eines Schleifenblocks
|
||||
end
|
||||
|
||||
-- Aufruf einer Funktion (mit Rückkehr über den Befehl 'return')
|
||||
call <label>
|
||||
|
||||
|
||||
[signs_bot_bot_inv.png|image]
|
||||
|
||||
### Weitere Sprungkommands
|
||||
|
||||
-- Überprüfe, ob sich <num> Gegenstände im
|
||||
-- truhenähnlichen Knoten befinden.
|
||||
-- Wenn nicht, springe zu <label>.
|
||||
-- <slot> ist der Bot-Inventar-Slot (1..8) um den Artikel anzugeben,
|
||||
-- oder 0 für jeden Artikel.
|
||||
jump_check_item <num> <slot> <label>
|
||||
|
||||
-- Siehe "Techage spezifische Kommandos"
|
||||
jump_low_batt <percent> <label>
|
||||
|
||||
|
||||
[signs_bot_bot_inv.png|image]
|
||||
|
||||
### Flow Control Beispiele
|
||||
|
||||
#### Beispiel mit einer Funktion am Anfang:
|
||||
|
||||
-- jump to the label 'main'
|
||||
jump main
|
||||
|
||||
-- starting point of the function with the name 'foo'
|
||||
foo:
|
||||
cmnd ...
|
||||
cmnd ...
|
||||
-- end of 'foo'. Jump back
|
||||
return
|
||||
|
||||
-- main program
|
||||
main:
|
||||
cmnd ...
|
||||
-- repeat all commands up to 'end' 10 times
|
||||
repeat 10
|
||||
cmnd ...
|
||||
-- call the subfunction 'foo'
|
||||
call foo
|
||||
cmnd ...
|
||||
-- end of the 'repeat' loop
|
||||
end
|
||||
-- end of the program
|
||||
exit
|
||||
|
||||
|
||||
#### Beispiel mit einer Funktion am Ende:
|
||||
|
||||
cmnd ...
|
||||
-- repeat all commands up to 'end' 10 times
|
||||
repeat 10
|
||||
cmnd ...
|
||||
-- call the subfunction 'foo'
|
||||
call foo
|
||||
cmnd ...
|
||||
-- end of the 'repeat' loop
|
||||
end
|
||||
-- end of the program
|
||||
exit
|
||||
|
||||
-- starting point of the function with the name 'foo'
|
||||
foo:
|
||||
cmnd ...
|
||||
cmnd ...
|
||||
-- end of 'foo'. Jump back
|
||||
return
|
590
signs_bot/manual_EN.lua
Normal file
@ -0,0 +1,590 @@
|
||||
return {
|
||||
titles = {
|
||||
"1,Signs Bot",
|
||||
"2,Firt Steps",
|
||||
"2,Signs",
|
||||
"2,Sensors and Actuators",
|
||||
"2,Sensor Connection Tool",
|
||||
"2,Inventory",
|
||||
"2,Nodes / Blocks",
|
||||
"3,Signs Bot Box",
|
||||
"3,Bot Flap",
|
||||
"3,Signs Duplicator",
|
||||
"3,Bot Sensor",
|
||||
"3,Node Sensor",
|
||||
"3,Crop Sensor",
|
||||
"3,Signs Bot Chest",
|
||||
"3,Bot Timer",
|
||||
"3,Bot Control Unit",
|
||||
"3,Sensor Extender",
|
||||
"3,Signal AND",
|
||||
"3,Signal Delayer",
|
||||
"3,Sign 'farming'",
|
||||
"3,Sign 'pattern'",
|
||||
"3,Sign 'copy3x3x3'",
|
||||
"3,Sign 'flowers'",
|
||||
"3,Sign 'aspen'",
|
||||
"3,Sign 'command'",
|
||||
"3,Sign \"turn right\"",
|
||||
"3,Sign \"turn left\"",
|
||||
"3,Sign \"take item\"",
|
||||
"3,Sign \"add item\"",
|
||||
"3,Sign \"stop\"",
|
||||
"3,Sign \"add to cart\" (minecart)",
|
||||
"3,Sign \"take from cart\" (minecart)",
|
||||
"3,Sign 'take water' (xdecor)",
|
||||
"3,Sign 'cook soup' (xdecor)",
|
||||
"2,Bot Commands",
|
||||
"3,Techage specific commands",
|
||||
"3,Flow control commands",
|
||||
"3,Further jump commands",
|
||||
"3,Flow control Examples",
|
||||
"4,Example with a function at the beginning:",
|
||||
"4,Example with a function at the end:",
|
||||
},
|
||||
texts = {
|
||||
"A robot controlled by signs.\n"..
|
||||
"\n"..
|
||||
"On the web: https://github.com/joe7575/signs_bot/blob/master/manual_EN.md\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"After you have placed the Signs Bot Box\\, you can start the bot by means of the\n"..
|
||||
"'On' button in the box menu. If the bot returns to its box right away\\,\n"..
|
||||
"you will need to charge it with electrical energy (techage) first.\n"..
|
||||
"The bot then runs straight ahead until it reaches an obstacle\n"..
|
||||
"(a step with two or more blocks up or down or a sign.)\n"..
|
||||
"\n"..
|
||||
"The bot can only be controlled by signs that are placed in its path.\n"..
|
||||
"\n"..
|
||||
"If the bot first reaches a sign it will execute the commands on the sign.\n"..
|
||||
"If the first command on the sign is e.g. 'turn_around'\\, the bot turns and goes back.\n"..
|
||||
"In this case\\, the bot reaches his box again and turns off.\n"..
|
||||
"\n"..
|
||||
"If the bot first reaches an obstacle it will stop\\, or if available\\, execute\n"..
|
||||
"the next commands from the last sign.\n"..
|
||||
"\n"..
|
||||
"The Signs Bot Box has an inventory with 6 stacks for signs and 8 stacks for\n"..
|
||||
"other items (which are placed/mined by the bot). This inventory simulates the bot\n"..
|
||||
"internal inventory. That means you will only have access to the inventory\n"..
|
||||
"if the bot is turned off ('sitting' in his box).\n"..
|
||||
"\n"..
|
||||
"There are also the following blocks:\n"..
|
||||
"\n"..
|
||||
" - Sensors: These can send a signal to an actuator if they are connected to the actuator.\n"..
|
||||
" - Actuators: These perform an action when they receive a signal from a sensor.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"You control the direction of the bot using the \"turn left\" and\n"..
|
||||
"\"turn right\" signs (signs with the arrow). The bot can run over steps\n"..
|
||||
"(one block up/down). But there are also commands to move the bot up and down.\n"..
|
||||
"\n"..
|
||||
"It is not necessary to mark a way back to the box. With the command 'turn_off'\n"..
|
||||
"the bot will turn off and be back in his box from every position. The same applies\n"..
|
||||
"if you turn off the bot by the box menu. If the bot reaches a sign from the wrong\n"..
|
||||
"direction (from back or sides) the sign will be ignored.\n"..
|
||||
"The bot will simply step over the sign.\n"..
|
||||
"\n"..
|
||||
"All predefined signs have a menu with a list of the bot commands. These signs\n"..
|
||||
"can't be changed\\, but you can craft and program your own signs. For this you\n"..
|
||||
"have to use the 'command' sign. This sign has an edit field for your commands\n"..
|
||||
"and a help page with all available commands. The help page has a copy button\n"..
|
||||
"to simplify the programming.\n"..
|
||||
"\n"..
|
||||
"Also for your own signs it is important to know: After the execution of the last\n"..
|
||||
"command of the sign\\, the bot falls back into its default behaviour and runs in\n"..
|
||||
"its taken direction.\n"..
|
||||
"\n"..
|
||||
"A standard job for the bot is to move items from one chest to another chest\n"..
|
||||
"(or node with a chest like inventory). This can be done by means of the two signs\n"..
|
||||
"'take item' and 'add item'. These signs have to be placed on top of chest nodes.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"In addition to the signs the bot can be controlled by means of sensors. Sensors\n"..
|
||||
"like the Bot Sensor have two states: on and off. If the Bot Sensor detects a bot\n"..
|
||||
"it will switch to the state 'on' and sends a signal to a connected block\\,\n"..
|
||||
"called an actuator.\n"..
|
||||
"\n"..
|
||||
"Sensors are:\n"..
|
||||
"\n"..
|
||||
" - Bot Sensor: Sends a signal when a robot passes by\n"..
|
||||
" - Node Sensor: Sends a signal when it detects any (new) node\n"..
|
||||
" - Crop Sensor: Sends a signal when\\, for example wheat is fully grown\n"..
|
||||
" - Bot Chest: Sends a signal depending on the chest state (empty\\, full)\n"..
|
||||
"\n"..
|
||||
"Actuators are:\n"..
|
||||
"\n"..
|
||||
" - Signs Bot Box: Can turn the bot off and on\n"..
|
||||
" - Control Unit: Can be used to exchange the sign to lead the bot\n"..
|
||||
"\n"..
|
||||
"Sensors must be connected (paired) with actuators. This is what the\n"..
|
||||
"\"Sensor Connection Tool\" does.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"To send a signal from a sensor to an actuator\\, the sensor has to be connected\n"..
|
||||
"(paired) with actuator. To connect sensor and actuator\\, the Sensor Connection Tool\n"..
|
||||
"has to be used. Simply click with the tool on both blocks and the sensor will be\n"..
|
||||
"connected with the actuator. A successful connection is indicated by a ping/pong noise.\n"..
|
||||
"\n"..
|
||||
"Before you connect sensor with actuator\\, take care that the actuator is in the\n"..
|
||||
"requested state. For example: If you want to start the Bot with a sensor\\, connect\n"..
|
||||
"the sensor with the Bot Box\\, when the Bot is in the state 'on'. Otherwise the sensor\n"..
|
||||
"signal will stop the Bot\\, instead of starting it.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The following applies to all commands that place items/items in the bot inventory\\, such as:\n"..
|
||||
"\n"..
|
||||
" - 'take_item <num> <slot>'\n"..
|
||||
" - 'pickup_items <slot>'\n"..
|
||||
" - 'trash_sign <slot>'\n"..
|
||||
" - 'harvest <slot>'\n"..
|
||||
" - 'dig_front <slot> <lvl>'\n"..
|
||||
"\n"..
|
||||
"If no slot or slot 0 was specified with the command (case A)\\, all 8 slots of the bot\n"..
|
||||
"inventory are checked one after the other. If a slot was specified (case B)\\,\n"..
|
||||
"only this slot is checked. \n"..
|
||||
"In both cases the following applies: \n"..
|
||||
"\n"..
|
||||
"If the slot is preconfigured and matches the item\\, or if the slot is unconfigured\n"..
|
||||
"and empty\\, or only partially filled with the item type to be added\\, \n"..
|
||||
"then the item(s) will be added.\n"..
|
||||
"If not all items can be added\\, in case A the remaining slots are tried. \n"..
|
||||
"Anything that couldn't be added to your inventory will go back or be dropped.\n"..
|
||||
"\n"..
|
||||
"The following applies to all commands that are used to take items from the bot inventory\\, like:\n"..
|
||||
"\n"..
|
||||
" - 'add_item <num> <slot>'\n"..
|
||||
"\n"..
|
||||
"It doesn't matter whether a slot is configured or not. The bot takes the first stack\n"..
|
||||
"that it can find from its own inventory and tries to use it. If a slot is specified\\,\n"..
|
||||
"it only takes this\\, if no slot has been specified\\, it checks all of them one after\n"..
|
||||
"the other\\, starting from slot 1 until it finds something. If the number found is\n"..
|
||||
"smaller than requested\\, he tries to take the rest out of any other slot.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"",
|
||||
"The Box is the housing of the bot. Place the box and start the bot by means of the\n"..
|
||||
"'On' button. If the mod techage is installed\\, the bot needs electrical power.\n"..
|
||||
"The bot leaves the box on the right side. It will not start\\, if this position is blocked.\n"..
|
||||
"\n"..
|
||||
"To stop and remove the bot\\, press the 'Off' button.\n"..
|
||||
"The box inventory simulates the inventory of the bot.\n"..
|
||||
"You will not be able to access the inventory\\, if the bot is running.\n"..
|
||||
"The bot can carry up to 8 stacks and 6 signs with it.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The flap is a simple block used as door for the bot. Place the flap in any wall\\,\n"..
|
||||
"and the bot will automatically open and close the flap as it passes through it.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Duplicator can be used to make copies of signs:\n"..
|
||||
"\n"..
|
||||
" - Put one 'cmnd' sign to be used as template into the 'Template' inventory\n"..
|
||||
" - Add one or several 'blank signs' to the 'Input' inventory.\n"..
|
||||
" - Take the copies from the 'Output' inventory.\n"..
|
||||
"\n"..
|
||||
"Written books \\[default:book_written\\] can alternatively be used as template.\n"..
|
||||
"Already written signs can be used as input\\, too.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Bot Sensor detects any bot and sends a signal\\, if a bot is nearby.\n"..
|
||||
"The sensor range is one node/meter.\" The sensor direction does not care.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The node sensor sends cyclical signals when it detects that nodes have appeared\n"..
|
||||
"or disappeared\\, but has to be configured accordingly. Valid nodes are all kind\n"..
|
||||
"of blocks and plants. The sensor range is 3 nodes/meters in one direction.\n"..
|
||||
"The sensor has an active side (red) that must point to the observed area.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Crop Sensor sends cyclical signals when\\, for example\\, wheat is fully grown.\n"..
|
||||
"The sensor range is one node/meter. The sensor has an active side (red) that\n"..
|
||||
"must point to the crop/field.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Signs Bot Chest is a special chest with sensor function. It sends a signal\n"..
|
||||
"depending on the chest state. Possible states are 'empty'\\, 'not empty'\\, 'almost full'\n"..
|
||||
"\n"..
|
||||
"A typical use case is to turn off the bot\\, when the chest is almost full or empty.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"This is a special kind of sensor. Can be programmed with a time in seconds\\,\n"..
|
||||
"e.g. to start the bot cyclically.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Bot Control Unit is used to lead the bot by means of signs. The unit can be\n"..
|
||||
"loaded with up to 4 different signs and can be programmed by means of sensors.\n"..
|
||||
"\n"..
|
||||
"To load the unit\\, place a sign on the red side of the unit and click on the unit.\n"..
|
||||
"The sign disappears / is moved to the inventory of the unit.\n"..
|
||||
"This can be repeated 3 times.\n"..
|
||||
"\n"..
|
||||
"Use the connection tool to connect up to 4 sensors with the Bot Control Unit.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"With the Sensor Extender\\, sensor signals can be sent to more than one actuator.\n"..
|
||||
"Place one or more extender nearby the sensor and connect each extender with one\n"..
|
||||
"further actuator by means of the Connection Tool.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Signal is sent\\, if all input signals are received.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Signals are forwarded delayed. Subsequent signals are queued. \n"..
|
||||
"The delay time can be configured.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Used to harvest and seed a 3x3 field. Place the sign in front of the field.\n"..
|
||||
"The seed used must be in the first slot of the bot inventory.\n"..
|
||||
"When the bot is done\\, the bot will turn and walk back.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Used to make a copy of a 3x3x3 cube. Place the sign in front of the pattern\n"..
|
||||
"to be copied. Use the copy sign to make the copy of this pattern on a different\n"..
|
||||
"location. The bot must first reach the pattern sign\\, then the copy sign.\n"..
|
||||
"\n"..
|
||||
"Used to make a copy of a 3x3x3 cube. Place the shield in front of the blocks\n"..
|
||||
"to be copied. Use the copy sign to make the copy of these blocks in another\n"..
|
||||
"location. The bot must first process the \"pattern\" sign\\, only then can the bot\n"..
|
||||
"be directed to the copy sign.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Used to make a copy of a 3x3x3 cube. Place the sign in front of where you want\n"..
|
||||
"the copy to be made. See also sign \"pattern\".\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Used to cut flowers on a 3x3 field. Place the sign in front of the field.\n"..
|
||||
"When finished\\, the bot turns.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Used to harvest an aspen or pine tree trunk\n"..
|
||||
"\n"..
|
||||
" - Place the sign in front of the tree.\n"..
|
||||
" - Place a chest to the right of the sign.\n"..
|
||||
" - Put a dirt stack (10 items min.) into the chest.\n"..
|
||||
" - Preconfigure slot 1 of the bot inventory with dirt\n"..
|
||||
" - Preconfigure slot 2 of the bot inventory with saplings\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The 'command' sign can be programmed by the player. Place the sign in front\n"..
|
||||
"of you and use the node menu to program your sequence of bot commands.\n"..
|
||||
"The menu has an edit field for your commands and a help page with all\n"..
|
||||
"available commands. The help page has a copy button to simplify the programming.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Bot turns right when it detects this sign in front of it.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Bot turns left when it detects this sign in front of it.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Bot takes items out of a chest in front of it and then turns around.\n"..
|
||||
"This sign has to be placed on top of the chest.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Bot puts items into a chest in front of it and then turns around.\n"..
|
||||
"This sign has to be placed on top of the chest.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Bot will stop in front of this sign until the sign is removed or\n"..
|
||||
"the bot is turned off.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Bot puts items into a minecart in front of it\\, pushes the cart and then turns\n"..
|
||||
"around. This sign has to be placed on top of the rail at the cart end position.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Bot takes items out of a minecart in front of it\\, pushes the cart and then\n"..
|
||||
"turns around. This sign has to be placed on top of the rail at the cart end position.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Used to take water into bucket. Place the sign on a shore\\, in front of the still water pool. \n"..
|
||||
"\n"..
|
||||
"Items in slots:\n"..
|
||||
"\n"..
|
||||
" 1 - empty bucket\n"..
|
||||
"\n"..
|
||||
"The result is one bucket with water in selected inventory slot. When finished\\,\n"..
|
||||
"the bot turns around.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Used to cook a vegetable soup in cauldron. Cauldon should be empty and located\n"..
|
||||
"above flammable material. Place the sign in front of the cauldron with one field\n"..
|
||||
"space\\, to prevent wooden sign from catching fire.\n"..
|
||||
"\n"..
|
||||
"Items in slots:\n"..
|
||||
"\n"..
|
||||
" 1 - water bucket\"\n"..
|
||||
" 2 - vegetable #1 (i.e. tomato)\n"..
|
||||
" 3 - vegetable #2 (i.e. carrot)\n"..
|
||||
" 4 - empty bowl (from farming or xdecor mods)\n"..
|
||||
"\n"..
|
||||
" The result is one bowl with vegetable soup in selected inventory slot.\n"..
|
||||
"When finished\\, the bot turns around.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The commands are also all described as help in the \"Sign command\" node.\n"..
|
||||
"All blocks or signs that are set are taken from the bot inventory.\n"..
|
||||
"Any blocks or signs removed will be added back to the Bot Inventory.\n"..
|
||||
"'<slot>' is always the bot internal inventory stack (1..8).\n"..
|
||||
"\n"..
|
||||
" move <steps> - go one or more steps forward\n"..
|
||||
" cond_move - go to the nearest obstacle or sign\n"..
|
||||
" turn_left - turn left\n"..
|
||||
" turn_right - turn right\n"..
|
||||
" turn_around - turn around\n"..
|
||||
" backward - take a step back\n"..
|
||||
" turn_off - turn off the robot / back to the box\n"..
|
||||
" pause <sec> - wait one or more seconds\n"..
|
||||
" move_up - move up (maximum 2 times)\n"..
|
||||
" move_down - move down\n"..
|
||||
" fall_down - fall into a hole/chasm (up to 10 blocks)\n"..
|
||||
" take_item <num> <slot> - take one or more items from a box\n"..
|
||||
" add_item <num> <slot> - put one or more items in a box\n"..
|
||||
" add_fuel <num> <slot> - put fuel in a furnace\n"..
|
||||
" place_front <slot> <lvl> - place the block in front of the bot\n"..
|
||||
" place_left <slot> <lvl> - place the block to the left of the bot\n"..
|
||||
" place_right <slot> <lvl> - place the block to the right of the bot\n"..
|
||||
" place_below <slot> - lift the robot and put the block under the robot\n"..
|
||||
" place_above <slot> - set block above the robot\n"..
|
||||
" dig_front <slot> <lvl> - remove block in front of the robot\n"..
|
||||
" dig_left <slot> <lvl> - remove block on the left\n"..
|
||||
" dig_right <slot> <lvl> - remove block on the right\n"..
|
||||
" dig_below <slot> - remove block under the robot\n"..
|
||||
" dig_above <slot> - remove block above the robot\n"..
|
||||
" rotate_item <lvl> <steps> - rotate a block in front of the robot\n"..
|
||||
" set_param2 <lvl> <param2> - set param2 of the block in front of the robot\n"..
|
||||
" place_sign <slot> - set sign\n"..
|
||||
" place_sign_behind <slot> - put a sign behind the bot\n"..
|
||||
" dig_sign <slot> - remove the sign\n"..
|
||||
" trash_sign <slot> - Remove the sign\\, clear data and add to the item Inventory\n"..
|
||||
" stop - Bot stops until the shield is removed\n"..
|
||||
" pickup_items <slot> - pickup items (in a 3x3 field)\n"..
|
||||
" drop_items <num> <slot> - drop items\n"..
|
||||
" harvest - harvest a 3x3 field (farming)\n"..
|
||||
" cutting - cut flowers in a 3x3 field\n"..
|
||||
" sow_seed <slot> - see/plant a 3x3 field\n"..
|
||||
" plant_sapling <slot> - plant a sapling in front of the robot\n"..
|
||||
" pattern - save the block properties behind the sign (3x3x3 cube) as a template\n"..
|
||||
" copy <size> - make a 3x3x3 copy of the stored template\n"..
|
||||
" punch_cart - bump a mine cart\n"..
|
||||
" add_compost <slot> - Put 2 leaves into the compost barrel\n"..
|
||||
" take_compost <slot> - Take a compost item from the barrel\n"..
|
||||
" print <text> - Output chat message for debug purposes\n"..
|
||||
" take_water <slot> - Take water with empty bucket\n"..
|
||||
" fill_cauldron <slot> - Fill the xdecor cauldron for a soup\n"..
|
||||
" take_soup <slot> - Take boiling soup into empty bowl from cauldron\n"..
|
||||
" flame_on - Make fire\n"..
|
||||
" flame_off - Put out the fire\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
" ignite - Ignite the techage charcoal lighter\n"..
|
||||
" low_batt <percent> - Turn the bot off if the battery power is below the \n"..
|
||||
" given value in percent (1..99)\n"..
|
||||
" jump_low_batt <percent> <label> - Jump to <label> if the battery power is below the \n"..
|
||||
" given value in percent (1..99)\n"..
|
||||
" (see \"Flow control commands\")\n"..
|
||||
" send_cmnd <receiver> <command> - Send a techage command to a given node. \n"..
|
||||
" Receiver is addressed by the techage node number. \n"..
|
||||
" For commands with two or more words\\, \n"..
|
||||
" use the '*' character instead of spaces\\, e.g.: \n"..
|
||||
" send_cmnd 3465 pull*default:dirt*2\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
" -- jump command\\, <label> is a word from the characters a-z or A-Z\n"..
|
||||
" jump <label>\n"..
|
||||
" \n"..
|
||||
" -- jump label / start of a function\n"..
|
||||
" <label>:\n"..
|
||||
" \n"..
|
||||
" -- return from a function\n"..
|
||||
" return\n"..
|
||||
" \n"..
|
||||
" -- start of a loop block\\, <num> is a number 1..999\n"..
|
||||
" repeat <num>\n"..
|
||||
" \n"..
|
||||
" -- end of a loop block\n"..
|
||||
" end\n"..
|
||||
" \n"..
|
||||
" -- call of a function (with return via the command 'return')\n"..
|
||||
" call <label>\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
" -- Check if there are <num> items in the chest like node.\n"..
|
||||
" -- If not\\, jump to <label>.\n"..
|
||||
" -- <slot> is the bot inventory slot (1..8) to\n"..
|
||||
" -- specify the item\\, or 0 for any item.\n"..
|
||||
" jump_check_item <num> <slot> <label>\n"..
|
||||
" \n"..
|
||||
" -- See \"Techage specific commands\"\n"..
|
||||
" jump_low_batt <percent> <label>\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"",
|
||||
" -- jump to the label 'main'\n"..
|
||||
" jump main\n"..
|
||||
" \n"..
|
||||
" -- starting point of the function with the name 'foo'\n"..
|
||||
" foo:\n"..
|
||||
" cmnd ...\n"..
|
||||
" cmnd ...\n"..
|
||||
" -- end of 'foo'. Jump back\n"..
|
||||
" return\n"..
|
||||
" \n"..
|
||||
" -- main program\n"..
|
||||
" main:\n"..
|
||||
" cmnd ...\n"..
|
||||
" -- repeat all commands up to 'end' 10 times\n"..
|
||||
" repeat 10\n"..
|
||||
" cmnd ...\n"..
|
||||
" -- call the subfunction 'foo'\n"..
|
||||
" call foo\n"..
|
||||
" cmnd ...\n"..
|
||||
" -- end of the 'repeat' loop\n"..
|
||||
" end\n"..
|
||||
" -- end of the program\n"..
|
||||
" exit\n"..
|
||||
"\n",
|
||||
" cmnd ...\n"..
|
||||
" -- repeat all commands up to 'end' 10 times\n"..
|
||||
" repeat 10\n"..
|
||||
" cmnd ...\n"..
|
||||
" -- call the subfunction 'foo'\n"..
|
||||
" call foo\n"..
|
||||
" cmnd ...\n"..
|
||||
" -- end of the 'repeat' loop\n"..
|
||||
" end\n"..
|
||||
" -- end of the program\n"..
|
||||
" exit\n"..
|
||||
" \n"..
|
||||
" -- starting point of the function with the name 'foo'\n"..
|
||||
" foo:\n"..
|
||||
" cmnd ...\n"..
|
||||
" cmnd ...\n"..
|
||||
" -- end of 'foo'. Jump back\n"..
|
||||
" return\n"..
|
||||
"\n",
|
||||
},
|
||||
images = {
|
||||
"signs_bot_bot_inv.png",
|
||||
"signs_bot_bot_inv.png",
|
||||
"signs_bot_sign_left.png",
|
||||
"signs_bot_sensor_crop_inv.png",
|
||||
"signs_bot_tool.png",
|
||||
"signs_bot:box",
|
||||
"",
|
||||
"signs_bot:box",
|
||||
"signs_bot:bot_flap",
|
||||
"signs_bot:duplicator",
|
||||
"signs_bot:bot_sensor",
|
||||
"signs_bot:node_sensor",
|
||||
"signs_bot:crop_sensor",
|
||||
"signs_bot:chest",
|
||||
"signs_bot:timer",
|
||||
"signs_bot:changer1",
|
||||
"signs_bot:sensor_extender",
|
||||
"signs_bot:and1",
|
||||
"signs_bot:delayer",
|
||||
"signs_bot:farming",
|
||||
"signs_bot:pattern",
|
||||
"signs_bot:copy3x3x3",
|
||||
"signs_bot:flowers",
|
||||
"signs_bot:aspen",
|
||||
"signs_bot:sign_cmnd",
|
||||
"signs_bot:sign_right",
|
||||
"signs_bot:sign_left",
|
||||
"signs_bot:sign_take",
|
||||
"signs_bot:sign_add",
|
||||
"signs_bot:sign_stop",
|
||||
"signs_bot:sign_add_cart",
|
||||
"signs_bot:sign_take_cart",
|
||||
"signs_bot:water",
|
||||
"signs_bot:soup",
|
||||
"signs_bot_bot_inv.png",
|
||||
"signs_bot_bot_inv.png",
|
||||
"signs_bot_bot_inv.png",
|
||||
"signs_bot_bot_inv.png",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
},
|
||||
plans = {
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
}
|
||||
}
|
542
signs_bot/manual_EN.md
Normal file
@ -0,0 +1,542 @@
|
||||
# Signs Bot
|
||||
|
||||
A robot controlled by signs.
|
||||
|
||||
On the web: https://github.com/joe7575/signs_bot/blob/master/manual_EN.md
|
||||
|
||||
[signs_bot_bot_inv.png|image]
|
||||
|
||||
## Firt Steps
|
||||
|
||||
After you have placed the Signs Bot Box, you can start the bot by means of the
|
||||
'On' button in the box menu. If the bot returns to its box right away,
|
||||
you will need to charge it with electrical energy (techage) first.
|
||||
The bot then runs straight ahead until it reaches an obstacle
|
||||
(a step with two or more blocks up or down or a sign.)
|
||||
|
||||
The bot can only be controlled by signs that are placed in its path.
|
||||
|
||||
If the bot first reaches a sign it will execute the commands on the sign.
|
||||
If the first command on the sign is e.g. 'turn_around', the bot turns and goes back.
|
||||
In this case, the bot reaches his box again and turns off.
|
||||
|
||||
If the bot first reaches an obstacle it will stop, or if available, execute
|
||||
the next commands from the last sign.
|
||||
|
||||
The Signs Bot Box has an inventory with 6 stacks for signs and 8 stacks for
|
||||
other items (which are placed/mined by the bot). This inventory simulates the bot
|
||||
internal inventory. That means you will only have access to the inventory
|
||||
if the bot is turned off ('sitting' in his box).
|
||||
|
||||
There are also the following blocks:
|
||||
- Sensors: These can send a signal to an actuator if they are connected to the actuator.
|
||||
- Actuators: These perform an action when they receive a signal from a sensor.
|
||||
|
||||
[signs_bot_bot_inv.png|image]
|
||||
|
||||
## Signs
|
||||
|
||||
You control the direction of the bot using the "turn left" and
|
||||
"turn right" signs (signs with the arrow). The bot can run over steps
|
||||
(one block up/down). But there are also commands to move the bot up and down.
|
||||
|
||||
It is not necessary to mark a way back to the box. With the command 'turn_off'
|
||||
the bot will turn off and be back in his box from every position. The same applies
|
||||
if you turn off the bot by the box menu. If the bot reaches a sign from the wrong
|
||||
direction (from back or sides) the sign will be ignored.
|
||||
The bot will simply step over the sign.
|
||||
|
||||
All predefined signs have a menu with a list of the bot commands. These signs
|
||||
can't be changed, but you can craft and program your own signs. For this you
|
||||
have to use the 'command' sign. This sign has an edit field for your commands
|
||||
and a help page with all available commands. The help page has a copy button
|
||||
to simplify the programming.
|
||||
|
||||
Also for your own signs it is important to know: After the execution of the last
|
||||
command of the sign, the bot falls back into its default behaviour and runs in
|
||||
its taken direction.
|
||||
|
||||
A standard job for the bot is to move items from one chest to another chest
|
||||
(or node with a chest like inventory). This can be done by means of the two signs
|
||||
'take item' and 'add item'. These signs have to be placed on top of chest nodes.
|
||||
|
||||
[signs_bot_sign_left.png|image]
|
||||
|
||||
## Sensors and Actuators
|
||||
|
||||
In addition to the signs the bot can be controlled by means of sensors. Sensors
|
||||
like the Bot Sensor have two states: on and off. If the Bot Sensor detects a bot
|
||||
it will switch to the state 'on' and sends a signal to a connected block,
|
||||
called an actuator.
|
||||
|
||||
Sensors are:
|
||||
|
||||
- Bot Sensor: Sends a signal when a robot passes by
|
||||
- Node Sensor: Sends a signal when it detects any (new) node
|
||||
- Crop Sensor: Sends a signal when, for example wheat is fully grown
|
||||
- Bot Chest: Sends a signal depending on the chest state (empty, full)
|
||||
|
||||
Actuators are:
|
||||
|
||||
- Signs Bot Box: Can turn the bot off and on
|
||||
- Control Unit: Can be used to exchange the sign to lead the bot
|
||||
|
||||
Sensors must be connected (paired) with actuators. This is what the
|
||||
"Sensor Connection Tool" does.
|
||||
|
||||
[signs_bot_sensor_crop_inv.png|image]
|
||||
|
||||
|
||||
## Sensor Connection Tool
|
||||
|
||||
To send a signal from a sensor to an actuator, the sensor has to be connected
|
||||
(paired) with actuator. To connect sensor and actuator, the Sensor Connection Tool
|
||||
has to be used. Simply click with the tool on both blocks and the sensor will be
|
||||
connected with the actuator. A successful connection is indicated by a ping/pong noise.
|
||||
|
||||
Before you connect sensor with actuator, take care that the actuator is in the
|
||||
requested state. For example: If you want to start the Bot with a sensor, connect
|
||||
the sensor with the Bot Box, when the Bot is in the state 'on'. Otherwise the sensor
|
||||
signal will stop the Bot, instead of starting it.
|
||||
|
||||
[signs_bot_tool.png|image]
|
||||
|
||||
|
||||
## Inventory
|
||||
|
||||
The following applies to all commands that place items/items in the bot inventory, such as:
|
||||
|
||||
|
||||
- `take_item <num> <slot>`
|
||||
- `pickup_items <slot>`
|
||||
- `trash_sign <slot>`
|
||||
- `harvest <slot>`
|
||||
- `dig_front <slot> <lvl>`
|
||||
|
||||
If no slot or slot 0 was specified with the command (case A), all 8 slots of the bot
|
||||
inventory are checked one after the other. If a slot was specified (case B),
|
||||
only this slot is checked.
|
||||
In both cases the following applies:
|
||||
|
||||
If the slot is preconfigured and matches the item, or if the slot is unconfigured
|
||||
and empty, or only partially filled with the item type to be added,
|
||||
then the item(s) will be added.
|
||||
If not all items can be added, in case A the remaining slots are tried.
|
||||
Anything that couldn't be added to your inventory will go back or be dropped.
|
||||
|
||||
The following applies to all commands that are used to take items from the bot inventory, like:
|
||||
|
||||
- `add_item <num> <slot>`
|
||||
|
||||
It doesn't matter whether a slot is configured or not. The bot takes the first stack
|
||||
that it can find from its own inventory and tries to use it. If a slot is specified,
|
||||
it only takes this, if no slot has been specified, it checks all of them one after
|
||||
the other, starting from slot 1 until it finds something. If the number found is
|
||||
smaller than requested, he tries to take the rest out of any other slot.
|
||||
|
||||
[signs_bot:box|image]
|
||||
|
||||
## Nodes / Blocks
|
||||
|
||||
### Signs Bot Box
|
||||
|
||||
The Box is the housing of the bot. Place the box and start the bot by means of the
|
||||
'On' button. If the mod techage is installed, the bot needs electrical power.
|
||||
The bot leaves the box on the right side. It will not start, if this position is blocked.
|
||||
|
||||
To stop and remove the bot, press the 'Off' button.
|
||||
The box inventory simulates the inventory of the bot.
|
||||
You will not be able to access the inventory, if the bot is running.
|
||||
The bot can carry up to 8 stacks and 6 signs with it.
|
||||
|
||||
[signs_bot:box|image]
|
||||
|
||||
### Bot Flap
|
||||
|
||||
The flap is a simple block used as door for the bot. Place the flap in any wall,
|
||||
and the bot will automatically open and close the flap as it passes through it.
|
||||
|
||||
[signs_bot:bot_flap|image]
|
||||
|
||||
### Signs Duplicator
|
||||
|
||||
The Duplicator can be used to make copies of signs:
|
||||
|
||||
1. Put one 'cmnd' sign to be used as template into the 'Template' inventory
|
||||
2. Add one or several 'blank signs' to the 'Input' inventory.
|
||||
3. Take the copies from the 'Output' inventory.
|
||||
|
||||
Written books [default:book_written] can alternatively be used as template.
|
||||
Already written signs can be used as input, too.
|
||||
|
||||
[signs_bot:duplicator|image]
|
||||
|
||||
### Bot Sensor
|
||||
|
||||
The Bot Sensor detects any bot and sends a signal, if a bot is nearby.
|
||||
The sensor range is one node/meter." The sensor direction does not care.
|
||||
|
||||
[signs_bot:bot_sensor|image]
|
||||
|
||||
### Node Sensor
|
||||
|
||||
The node sensor sends cyclical signals when it detects that nodes have appeared
|
||||
or disappeared, but has to be configured accordingly. Valid nodes are all kind
|
||||
of blocks and plants. The sensor range is 3 nodes/meters in one direction.
|
||||
The sensor has an active side (red) that must point to the observed area.
|
||||
|
||||
[signs_bot:node_sensor|image]
|
||||
|
||||
### Crop Sensor
|
||||
|
||||
The Crop Sensor sends cyclical signals when, for example, wheat is fully grown.
|
||||
The sensor range is one node/meter. The sensor has an active side (red) that
|
||||
must point to the crop/field.
|
||||
|
||||
[signs_bot:crop_sensor|image]
|
||||
|
||||
### Signs Bot Chest
|
||||
|
||||
The Signs Bot Chest is a special chest with sensor function. It sends a signal
|
||||
depending on the chest state. Possible states are 'empty', 'not empty', 'almost full'
|
||||
|
||||
A typical use case is to turn off the bot, when the chest is almost full or empty.
|
||||
|
||||
[signs_bot:chest|image]
|
||||
|
||||
### Bot Timer
|
||||
|
||||
This is a special kind of sensor. Can be programmed with a time in seconds,
|
||||
e.g. to start the bot cyclically.
|
||||
|
||||
[signs_bot:timer|image]
|
||||
|
||||
### Bot Control Unit
|
||||
|
||||
The Bot Control Unit is used to lead the bot by means of signs. The unit can be
|
||||
loaded with up to 4 different signs and can be programmed by means of sensors.
|
||||
|
||||
To load the unit, place a sign on the red side of the unit and click on the unit.
|
||||
The sign disappears / is moved to the inventory of the unit.
|
||||
This can be repeated 3 times.
|
||||
|
||||
Use the connection tool to connect up to 4 sensors with the Bot Control Unit.
|
||||
|
||||
[signs_bot:changer1|image]
|
||||
|
||||
### Sensor Extender
|
||||
|
||||
With the Sensor Extender, sensor signals can be sent to more than one actuator.
|
||||
Place one or more extender nearby the sensor and connect each extender with one
|
||||
further actuator by means of the Connection Tool.
|
||||
|
||||
[signs_bot:sensor_extender|image]
|
||||
|
||||
### Signal AND
|
||||
|
||||
Signal is sent, if all input signals are received.
|
||||
|
||||
[signs_bot:and1|image]
|
||||
|
||||
### Signal Delayer
|
||||
|
||||
Signals are forwarded delayed. Subsequent signals are queued.
|
||||
The delay time can be configured.
|
||||
|
||||
[signs_bot:delayer|image]
|
||||
|
||||
### Sign 'farming'
|
||||
|
||||
Used to harvest and seed a 3x3 field. Place the sign in front of the field.
|
||||
The seed used must be in the first slot of the bot inventory.
|
||||
When the bot is done, the bot will turn and walk back.
|
||||
|
||||
[signs_bot:farming|image]
|
||||
|
||||
### Sign 'pattern'
|
||||
|
||||
Used to make a copy of a 3x3x3 cube. Place the sign in front of the pattern
|
||||
to be copied. Use the copy sign to make the copy of this pattern on a different
|
||||
location. The bot must first reach the pattern sign, then the copy sign.
|
||||
|
||||
Used to make a copy of a 3x3x3 cube. Place the shield in front of the blocks
|
||||
to be copied. Use the copy sign to make the copy of these blocks in another
|
||||
location. The bot must first process the "pattern" sign, only then can the bot
|
||||
be directed to the copy sign.
|
||||
|
||||
[signs_bot:pattern|image]
|
||||
|
||||
### Sign 'copy3x3x3'
|
||||
|
||||
Used to make a copy of a 3x3x3 cube. Place the sign in front of where you want
|
||||
the copy to be made. See also sign "pattern".
|
||||
|
||||
[signs_bot:copy3x3x3|image]
|
||||
|
||||
### Sign 'flowers'
|
||||
|
||||
Used to cut flowers on a 3x3 field. Place the sign in front of the field.
|
||||
When finished, the bot turns.
|
||||
|
||||
[signs_bot:flowers|image]
|
||||
|
||||
### Sign 'aspen'
|
||||
|
||||
Used to harvest an aspen or pine tree trunk
|
||||
|
||||
- Place the sign in front of the tree.
|
||||
- Place a chest to the right of the sign.
|
||||
- Put a dirt stack (10 items min.) into the chest.
|
||||
- Preconfigure slot 1 of the bot inventory with dirt
|
||||
- Preconfigure slot 2 of the bot inventory with saplings
|
||||
|
||||
[signs_bot:aspen|image]
|
||||
|
||||
### Sign 'command'
|
||||
|
||||
The 'command' sign can be programmed by the player. Place the sign in front
|
||||
of you and use the node menu to program your sequence of bot commands.
|
||||
The menu has an edit field for your commands and a help page with all
|
||||
available commands. The help page has a copy button to simplify the programming.
|
||||
|
||||
[signs_bot:sign_cmnd|image]
|
||||
|
||||
### Sign "turn right"
|
||||
|
||||
The Bot turns right when it detects this sign in front of it.
|
||||
|
||||
[signs_bot:sign_right|image]
|
||||
|
||||
### Sign "turn left"
|
||||
|
||||
The Bot turns left when it detects this sign in front of it.
|
||||
|
||||
[signs_bot:sign_left|image]
|
||||
|
||||
### Sign "take item"
|
||||
|
||||
The Bot takes items out of a chest in front of it and then turns around.
|
||||
This sign has to be placed on top of the chest.
|
||||
|
||||
[signs_bot:sign_take|image]
|
||||
|
||||
### Sign "add item"
|
||||
|
||||
The Bot puts items into a chest in front of it and then turns around.
|
||||
This sign has to be placed on top of the chest.
|
||||
|
||||
[signs_bot:sign_add|image]
|
||||
|
||||
### Sign "stop"
|
||||
|
||||
The Bot will stop in front of this sign until the sign is removed or
|
||||
the bot is turned off.
|
||||
|
||||
[signs_bot:sign_stop|image]
|
||||
|
||||
### Sign "add to cart" (minecart)
|
||||
|
||||
The Bot puts items into a minecart in front of it, pushes the cart and then turns
|
||||
around. This sign has to be placed on top of the rail at the cart end position.
|
||||
|
||||
[signs_bot:sign_add_cart|image]
|
||||
|
||||
### Sign "take from cart" (minecart)
|
||||
|
||||
The Bot takes items out of a minecart in front of it, pushes the cart and then
|
||||
turns around. This sign has to be placed on top of the rail at the cart end position.
|
||||
|
||||
[signs_bot:sign_take_cart|image]
|
||||
|
||||
### Sign 'take water' (xdecor)
|
||||
|
||||
Used to take water into bucket. Place the sign on a shore, in front of the still water pool.
|
||||
|
||||
Items in slots:
|
||||
|
||||
1 - empty bucket
|
||||
|
||||
The result is one bucket with water in selected inventory slot. When finished,
|
||||
the bot turns around.
|
||||
|
||||
[signs_bot:water|image]
|
||||
|
||||
### Sign 'cook soup' (xdecor)
|
||||
|
||||
Used to cook a vegetable soup in cauldron. Cauldon should be empty and located
|
||||
above flammable material. Place the sign in front of the cauldron with one field
|
||||
space, to prevent wooden sign from catching fire.
|
||||
|
||||
Items in slots:
|
||||
|
||||
1 - water bucket"
|
||||
2 - vegetable #1 (i.e. tomato)
|
||||
3 - vegetable #2 (i.e. carrot)
|
||||
4 - empty bowl (from farming or xdecor mods)
|
||||
|
||||
The result is one bowl with vegetable soup in selected inventory slot.
|
||||
When finished, the bot turns around.
|
||||
|
||||
[signs_bot:soup|image]
|
||||
|
||||
|
||||
## Bot Commands
|
||||
|
||||
The commands are also all described as help in the "Sign command" node.
|
||||
All blocks or signs that are set are taken from the bot inventory.
|
||||
Any blocks or signs removed will be added back to the Bot Inventory.
|
||||
`<slot>` is always the bot internal inventory stack (1..8).
|
||||
|
||||
move <steps> - go one or more steps forward
|
||||
cond_move - go to the nearest obstacle or sign
|
||||
turn_left - turn left
|
||||
turn_right - turn right
|
||||
turn_around - turn around
|
||||
backward - take a step back
|
||||
turn_off - turn off the robot / back to the box
|
||||
pause <sec> - wait one or more seconds
|
||||
move_up - move up (maximum 2 times)
|
||||
move_down - move down
|
||||
fall_down - fall into a hole/chasm (up to 10 blocks)
|
||||
take_item <num> <slot> - take one or more items from a box
|
||||
add_item <num> <slot> - put one or more items in a box
|
||||
add_fuel <num> <slot> - put fuel in a furnace
|
||||
place_front <slot> <lvl> - place the block in front of the bot
|
||||
place_left <slot> <lvl> - place the block to the left of the bot
|
||||
place_right <slot> <lvl> - place the block to the right of the bot
|
||||
place_below <slot> - lift the robot and put the block under the robot
|
||||
place_above <slot> - set block above the robot
|
||||
dig_front <slot> <lvl> - remove block in front of the robot
|
||||
dig_left <slot> <lvl> - remove block on the left
|
||||
dig_right <slot> <lvl> - remove block on the right
|
||||
dig_below <slot> - remove block under the robot
|
||||
dig_above <slot> - remove block above the robot
|
||||
rotate_item <lvl> <steps> - rotate a block in front of the robot
|
||||
set_param2 <lvl> <param2> - set param2 of the block in front of the robot
|
||||
place_sign <slot> - set sign
|
||||
place_sign_behind <slot> - put a sign behind the bot
|
||||
dig_sign <slot> - remove the sign
|
||||
trash_sign <slot> - Remove the sign, clear data and add to the item Inventory
|
||||
stop - Bot stops until the shield is removed
|
||||
pickup_items <slot> - pickup items (in a 3x3 field)
|
||||
drop_items <num> <slot> - drop items
|
||||
harvest - harvest a 3x3 field (farming)
|
||||
cutting - cut flowers in a 3x3 field
|
||||
sow_seed <slot> - see/plant a 3x3 field
|
||||
plant_sapling <slot> - plant a sapling in front of the robot
|
||||
pattern - save the block properties behind the sign (3x3x3 cube) as a template
|
||||
copy <size> - make a 3x3x3 copy of the stored template
|
||||
punch_cart - bump a mine cart
|
||||
add_compost <slot> - Put 2 leaves into the compost barrel
|
||||
take_compost <slot> - Take a compost item from the barrel
|
||||
print <text> - Output chat message for debug purposes
|
||||
take_water <slot> - Take water with empty bucket
|
||||
fill_cauldron <slot> - Fill the xdecor cauldron for a soup
|
||||
take_soup <slot> - Take boiling soup into empty bowl from cauldron
|
||||
flame_on - Make fire
|
||||
flame_off - Put out the fire
|
||||
|
||||
[signs_bot_bot_inv.png|image]
|
||||
|
||||
### Techage specific commands
|
||||
|
||||
ignite - Ignite the techage charcoal lighter
|
||||
low_batt <percent> - Turn the bot off if the battery power is below the
|
||||
given value in percent (1..99)
|
||||
jump_low_batt <percent> <label> - Jump to <label> if the battery power is below the
|
||||
given value in percent (1..99)
|
||||
(see "Flow control commands")
|
||||
send_cmnd <receiver> <command> - Send a techage command to a given node.
|
||||
Receiver is addressed by the techage node number.
|
||||
For commands with two or more words,
|
||||
use the '*' character instead of spaces, e.g.:
|
||||
send_cmnd 3465 pull*default:dirt*2
|
||||
|
||||
[signs_bot_bot_inv.png|image]
|
||||
|
||||
### Flow control commands
|
||||
|
||||
-- jump command, <label> is a word from the characters a-z or A-Z
|
||||
jump <label>
|
||||
|
||||
-- jump label / start of a function
|
||||
<label>:
|
||||
|
||||
-- return from a function
|
||||
return
|
||||
|
||||
-- start of a loop block, <num> is a number 1..999
|
||||
repeat <num>
|
||||
|
||||
-- end of a loop block
|
||||
end
|
||||
|
||||
-- call of a function (with return via the command 'return')
|
||||
call <label>
|
||||
|
||||
|
||||
[signs_bot_bot_inv.png|image]
|
||||
|
||||
### Further jump commands
|
||||
|
||||
-- Check if there are <num> items in the chest like node.
|
||||
-- If not, jump to <label>.
|
||||
-- <slot> is the bot inventory slot (1..8) to
|
||||
-- specify the item, or 0 for any item.
|
||||
jump_check_item <num> <slot> <label>
|
||||
|
||||
-- See "Techage specific commands"
|
||||
jump_low_batt <percent> <label>
|
||||
|
||||
|
||||
[signs_bot_bot_inv.png|image]
|
||||
|
||||
### Flow control Examples
|
||||
|
||||
#### Example with a function at the beginning:
|
||||
|
||||
-- jump to the label 'main'
|
||||
jump main
|
||||
|
||||
-- starting point of the function with the name 'foo'
|
||||
foo:
|
||||
cmnd ...
|
||||
cmnd ...
|
||||
-- end of 'foo'. Jump back
|
||||
return
|
||||
|
||||
-- main program
|
||||
main:
|
||||
cmnd ...
|
||||
-- repeat all commands up to 'end' 10 times
|
||||
repeat 10
|
||||
cmnd ...
|
||||
-- call the subfunction 'foo'
|
||||
call foo
|
||||
cmnd ...
|
||||
-- end of the 'repeat' loop
|
||||
end
|
||||
-- end of the program
|
||||
exit
|
||||
|
||||
|
||||
#### Example with a function at the end:
|
||||
|
||||
cmnd ...
|
||||
-- repeat all commands up to 'end' 10 times
|
||||
repeat 10
|
||||
cmnd ...
|
||||
-- call the subfunction 'foo'
|
||||
call foo
|
||||
cmnd ...
|
||||
-- end of the 'repeat' loop
|
||||
end
|
||||
-- end of the program
|
||||
exit
|
||||
|
||||
-- starting point of the function with the name 'foo'
|
||||
foo:
|
||||
cmnd ...
|
||||
cmnd ...
|
||||
-- end of 'foo'. Jump back
|
||||
return
|
201
signs_bot/markdown_to_lua.py
Normal file
@ -0,0 +1,201 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# install mistune v0.8.4 with: pip install mistune==0.8.4
|
||||
|
||||
import re
|
||||
import mistune
|
||||
|
||||
assert(mistune.__version__ == "0.8.4")
|
||||
|
||||
__version__ = "1.0"
|
||||
|
||||
class WikiLinkInlineLexer(mistune.InlineLexer):
|
||||
def enable_wiki_link(self):
|
||||
# add wiki_link rules
|
||||
self.rules.wiki_link = re.compile(
|
||||
r'\[' # [
|
||||
r'([\s\S]+?\|[\s\S]+?)' # name| img-type
|
||||
r'\](?!\])' # ]
|
||||
)
|
||||
|
||||
# Add wiki_link parser to default rules
|
||||
# you can insert it some place you like
|
||||
# but place matters, maybe 3 is not good
|
||||
self.default_rules.insert(3, 'wiki_link')
|
||||
|
||||
def output_wiki_link(self, m):
|
||||
text = m.group(1)
|
||||
name, itype = text.split('|')
|
||||
# you can create an custom render
|
||||
# you can also return the html if you like
|
||||
return self.renderer.wiki_link(name, itype)
|
||||
|
||||
class MarkdownToLua(mistune.Renderer):
|
||||
def __init__(self, *args, **kwargs):
|
||||
mistune.Renderer.__init__(self, *args, **kwargs)
|
||||
self.item_name = ""
|
||||
self.plan_table = ""
|
||||
self.is_first_header = True
|
||||
self.text_chunck = []
|
||||
self.lTitle = []
|
||||
self.lText = []
|
||||
self.lItemName = []
|
||||
self.lPlanTable = []
|
||||
print("Markdown-to-Lua v%s" % __version__)
|
||||
|
||||
def m2l_formspec_escape(self, text):
|
||||
text = text.replace("\\", "")
|
||||
text = text.replace("[", "\\\\[")
|
||||
text = text.replace("]", "\\\\]")
|
||||
text = text.replace(";", "\\\\;")
|
||||
text = text.replace(",", "\\\\,")
|
||||
text = text.replace('"', '\\"')
|
||||
text = text.replace('\n', '\\n')
|
||||
return text
|
||||
|
||||
def m2l_add_last_paragraph(self):
|
||||
"""
|
||||
Used to add a text block before the next header or at the end of the document
|
||||
"""
|
||||
self.lText.append(self.text_chunck)
|
||||
self.text_chunck = []
|
||||
self.lItemName.append(self.item_name)
|
||||
self.item_name = ""
|
||||
self.lPlanTable.append(self.plan_table)
|
||||
self.plan_table = ""
|
||||
##
|
||||
## Block Level
|
||||
##
|
||||
def block_code(self, code, lang):
|
||||
text = self.m2l_formspec_escape(code.strip())
|
||||
lines = text.split("\\n")
|
||||
lines = [" " + item for item in lines]
|
||||
self.text_chunck.extend(lines)
|
||||
self.text_chunck.append("")
|
||||
return ""
|
||||
|
||||
def header(self, text, level, raw=None):
|
||||
if not self.is_first_header:
|
||||
self.m2l_add_last_paragraph()
|
||||
self.is_first_header = False
|
||||
self.lTitle.append("%u,%s" % (level, self.m2l_formspec_escape(text)))
|
||||
return ""
|
||||
|
||||
def hrule(self):
|
||||
self.text_chunck.append("\n----------------------------------------------------\n")
|
||||
return ""
|
||||
|
||||
def paragraph(self, text):
|
||||
lines = text.split("\\n") + [""]
|
||||
self.text_chunck.extend(lines)
|
||||
return ""
|
||||
|
||||
def list(self, body, ordered=True):
|
||||
lines = body.split("\n")
|
||||
self.text_chunck.extend(lines)
|
||||
return ""
|
||||
|
||||
def list_item(self, text):
|
||||
return " - %s\n" % text.strip()
|
||||
##
|
||||
## Span Level
|
||||
##
|
||||
def emphasis(self, text):
|
||||
return "*%s*" % self.m2l_formspec_escape(text)
|
||||
|
||||
def double_emphasis(self, text):
|
||||
return "*%s*" % self.m2l_formspec_escape(text)
|
||||
|
||||
def codespan(self, text):
|
||||
return "'%s'" % self.m2l_formspec_escape(text)
|
||||
|
||||
def text(self, text):
|
||||
return self.m2l_formspec_escape(text)
|
||||
|
||||
def link(self, link, title, content):
|
||||
"""
|
||||
Used for plans and images:
|
||||
[myimage](/image/)
|
||||
[myplan](/plan/)
|
||||
"""
|
||||
if link == "/image/":
|
||||
self.item_name = content
|
||||
elif link == "/plan/":
|
||||
self.plan_table = content
|
||||
return content
|
||||
|
||||
def wiki_link(self, name, itype):
|
||||
"""
|
||||
Used for plans and images:
|
||||
[myimage|image]
|
||||
[myplan|plan]
|
||||
"""
|
||||
if itype == "image":
|
||||
self.item_name = name
|
||||
elif itype == "plan":
|
||||
self.plan_table = name
|
||||
return ""
|
||||
|
||||
def autolink(self, link, is_email=False):
|
||||
return link
|
||||
|
||||
def linebreak(self):
|
||||
return "\\n"
|
||||
|
||||
def newline(self):
|
||||
return "\\n"
|
||||
|
||||
def inline_html(self, text):
|
||||
#print(text)
|
||||
pass
|
||||
|
||||
def parse_md_file(self, src_name):
|
||||
print(" - Read MD file '%s'" % src_name)
|
||||
inline = WikiLinkInlineLexer(self)
|
||||
# enable the feature
|
||||
inline.enable_wiki_link()
|
||||
md = mistune.Markdown(renderer=self, inline=inline)
|
||||
md.renderer.src_name = src_name
|
||||
md.render(open(src_name, 'r').read())
|
||||
md.renderer.m2l_add_last_paragraph()
|
||||
|
||||
def lua_table(self, key, lData):
|
||||
lOut = []
|
||||
lOut.append(" %s = {" % key)
|
||||
for line in lData:
|
||||
lOut.append(' "%s",' % line)
|
||||
lOut.append(" }")
|
||||
return "\n".join(lOut)
|
||||
|
||||
def lua_text_table(self, key, lData):
|
||||
lOut = []
|
||||
lOut.append(" %s = {" % key)
|
||||
for lines in lData:
|
||||
for line in lines[:-1]:
|
||||
line = line.replace('<br>', '\\n')
|
||||
lOut.append(' "%s\\n"..' % line)
|
||||
if len(lines) > 0:
|
||||
lOut.append(' "%s\\n",' % lines[-1])
|
||||
else:
|
||||
lOut.append(' "",')
|
||||
lOut.append(" }")
|
||||
return "\n".join(lOut)
|
||||
|
||||
def gen_lua_file(self, dest_name):
|
||||
print(" - Write Lua file '%s'" % dest_name)
|
||||
lOut = []
|
||||
s = ",\n".join([self.lua_table("titles", self.lTitle),
|
||||
self.lua_text_table("texts", self.lText),
|
||||
self.lua_table("images", self.lItemName),
|
||||
self.lua_table("plans", self.lPlanTable)])
|
||||
open(dest_name, "w").write("return {\n%s\n}" % s)
|
||||
print("done.")
|
||||
|
||||
m2l = MarkdownToLua()
|
||||
m2l.parse_md_file("./manual_EN.md")
|
||||
m2l.gen_lua_file("./manual_EN.lua")
|
||||
|
||||
m2l = MarkdownToLua()
|
||||
m2l.parse_md_file("./manual_DE.md")
|
||||
m2l.gen_lua_file("./manual_DE.lua")
|
@ -1,4 +1,4 @@
|
||||
name=signs_bot
|
||||
depends = default,farming,basic_materials,tubelib2
|
||||
optional_depends = node_io,techage,doc,minecart,bucket,fire,xdecor,ethereal,compost
|
||||
optional_depends = node_io,techage,doc,minecart,bucket,fire,xdecor,ethereal,compost,doclib
|
||||
description = A robot controlled by signs
|
||||
|
@ -3,7 +3,7 @@
|
||||
Signs Bot
|
||||
=========
|
||||
|
||||
Copyright (C) 2019-2021 Joachim Stolberg
|
||||
Copyright (C) 2019-2023 Joachim Stolberg
|
||||
|
||||
GPL v3
|
||||
See LICENSE.txt for more information
|
||||
@ -13,6 +13,7 @@
|
||||
]]--
|
||||
|
||||
local lib = signs_bot.lib
|
||||
local enable_LBM = minetest.settings:get_bool("signs_bot_enable_LBM") == true
|
||||
|
||||
-- Called when robot is started
|
||||
function signs_bot.place_robot(pos1, pos2, param2)
|
||||
@ -122,7 +123,8 @@ minetest.register_node("signs_bot:robot_foot", {
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_lbm({
|
||||
if enable_LBM then
|
||||
minetest.register_lbm({
|
||||
label = "[signs_bot] Remove lost robots",
|
||||
name = "signs_bot:lost_robot_remove",
|
||||
nodenames = {"signs_bot:robot"},
|
||||
@ -139,4 +141,5 @@ minetest.register_lbm({
|
||||
signs_bot.remove_robot({robot_pos = pos})
|
||||
end
|
||||
end
|
||||
})
|
||||
})
|
||||
end
|
||||
|
4
signs_bot/settingtypes.txt
Normal file
@ -0,0 +1,4 @@
|
||||
# Enable robot part removal.
|
||||
# Activation makes sense if server crashes occur frequently,
|
||||
# whereby the function requires a lot of computing time.
|
||||
signs_bot_enable_LBM (Enable robot part removal) bool false
|
@ -221,15 +221,22 @@ send_cmnd 3465 pull*default:dirt*2]]),
|
||||
local meta = minetest.get_meta(pos)
|
||||
return meta:get_inventory(), "main"
|
||||
end,
|
||||
on_pull_item = function(pos, in_dir, num)
|
||||
on_pull_item = function(pos, in_dir, num, item_name)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
if item_name then
|
||||
local taken = inv:remove_item("main", {name = item_name, count = num})
|
||||
if taken:get_count() > 0 then
|
||||
return taken
|
||||
end
|
||||
else -- no item given
|
||||
return techage.get_items(pos, inv, "main", num)
|
||||
end
|
||||
end,
|
||||
on_push_item = function(pos, in_dir, stack)
|
||||
on_push_item = function(pos, in_dir, stack, idx)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
return techage.put_items(inv, "main", stack)
|
||||
return techage.put_items(inv, "main", stack, idx)
|
||||
end,
|
||||
on_unpull_item = function(pos, in_dir, stack)
|
||||
local meta = minetest.get_meta(pos)
|
||||
@ -275,21 +282,74 @@ send_cmnd 3465 pull*default:dirt*2]]),
|
||||
return "unsupported"
|
||||
end
|
||||
end,
|
||||
on_beduino_receive_cmnd = function(pos, src, topic, payload)
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
if topic == 1 then
|
||||
if payload[1] == 1 then -- on
|
||||
if not mem.running then
|
||||
signs_bot.start_robot(pos)
|
||||
return 0, {1}
|
||||
end
|
||||
else
|
||||
if mem.running then
|
||||
signs_bot.stop_robot(pos, mem)
|
||||
return 0, {1}
|
||||
end
|
||||
end
|
||||
else
|
||||
return 2, "" -- topic is unknown or invalid
|
||||
end
|
||||
end,
|
||||
on_beduino_request_data = function(pos, src, topic, payload)
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
if topic == 128 then -- state
|
||||
if mem.error then
|
||||
return 0, {5}
|
||||
elseif mem.running then
|
||||
if mem.curr_cmnd == "stop" then
|
||||
return 0, {3}
|
||||
elseif mem.blocked then
|
||||
return 0, {2}
|
||||
else
|
||||
return 0, {1} -- running
|
||||
end
|
||||
elseif mem.capa then
|
||||
if mem.capa <= 0 then
|
||||
return 0, {4} -- nopower
|
||||
elseif mem.capa >= signs_bot.MAX_CAPA then
|
||||
return 0, {6} -- stopped
|
||||
else
|
||||
return 0, {7} -- charging
|
||||
end
|
||||
else
|
||||
return 0, {6} -- stopped
|
||||
end
|
||||
else
|
||||
return 2, "" -- topic is unknown or invalid
|
||||
end
|
||||
end,
|
||||
})
|
||||
techage.register_node({"signs_bot:chest"}, {
|
||||
on_inv_request = function(pos, in_dir, access_type)
|
||||
local meta = minetest.get_meta(pos)
|
||||
return meta:get_inventory(), "main"
|
||||
end,
|
||||
on_pull_item = function(pos, in_dir, num)
|
||||
on_pull_item = function(pos, in_dir, num, item_name)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
if item_name then
|
||||
local taken = inv:remove_item("main", {name = item_name, count = num})
|
||||
if taken:get_count() > 0 then
|
||||
return taken
|
||||
end
|
||||
else -- no item given
|
||||
return techage.get_items(pos, inv, "main", num)
|
||||
end
|
||||
end,
|
||||
on_push_item = function(pos, in_dir, stack)
|
||||
on_push_item = function(pos, in_dir, stack, idx)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
return techage.put_items(inv, "main", stack)
|
||||
return techage.put_items(inv, "main", stack, idx)
|
||||
end,
|
||||
on_unpull_item = function(pos, in_dir, stack)
|
||||
local meta = minetest.get_meta(pos)
|
||||
|
@ -123,6 +123,7 @@ local function on_receive_fields(pos, formname, fields, player)
|
||||
elseif cycle_time == 0 then
|
||||
minetest.get_node_timer(pos):stop()
|
||||
mem.time = 0
|
||||
mem.running = false
|
||||
meta:set_int("cycle_time", 0)
|
||||
end
|
||||
end
|
||||
|
@ -166,7 +166,7 @@ end
|
||||
|
||||
local function valid_payload(payload)
|
||||
if not payload then return false end
|
||||
if not type(payload) == "table" then return false end
|
||||
if type(payload) ~= "table" then return false end
|
||||
if not payload.get then return false end
|
||||
if not payload.next then return false end
|
||||
return true
|
||||
|
@ -629,8 +629,8 @@ 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>
|
||||
TechAge, a mod to go through 5 tech ages in search of wealth and power.
|
||||
Copyright (C) 2019-2023 Joachim Stolberg
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
|
@ -38,7 +38,7 @@ Many thanks to Thomas-S, niklp09, and others for their contributions
|
||||
|
||||
|
||||
### Dependencies
|
||||
Required: default, doors, bucket, stairs, screwdriver, basic_materials, tubelib2, networks, minecart, lcdlib, safer_lua
|
||||
Required: default, doors, bucket, stairs, screwdriver, basic_materials, tubelib2, networks, minecart, lcdlib, safer_lua, doclib
|
||||
Recommended: signs_bot, hyperloop, compost, techpack_stairway, autobahn
|
||||
Optional: unified_inventory, wielded_light, unifieddyes, lua-mashal, lsqlite3, moreores, ethereal, mesecon
|
||||
|
||||
@ -53,6 +53,7 @@ The following mods in the newest version have to be downloaded directly from Git
|
||||
* [minecart](https://github.com/joe7575/minecart)
|
||||
* [lcdlib](https://github.com/joe7575/lcdlib)
|
||||
* [safer_lua](https://github.com/joe7575/safer_lua)
|
||||
* [doclib](https://github.com/joe7575/doclib)
|
||||
|
||||
It is highly recommended that you install the following mods, too:
|
||||
|
||||
@ -63,6 +64,12 @@ It is highly recommended that you install the following mods, too:
|
||||
* [autobahn](https://github.com/joe7575/autobahn): Street blocks and slopes with stripes for faster traveling
|
||||
* [ta4_jetpack](https://github.com/joe7575/ta4_jetpack): A Jetpack with hydrogen as fuel and TA4 recipe
|
||||
|
||||
More recommended Techage related mods by other authors:
|
||||
|
||||
* [ta4_addons](https://github.com/Thomas--S/ta4_addons) from Thomas--S: A Touchscreen for the Lua controller
|
||||
* [ts_vehicles](https://github.com/Thomas--S/ts_vehicles) from Thomas--S: A mod to provide cars and other vehicles for Minetest.
|
||||
* [ta_apiary](https://gitlab.com/lesya_minetest_mods/ta_apiary) from Olesya Sibidanova: TechAge Machines for beekeeping
|
||||
|
||||
For large servers with many players, the following packages are recommended:
|
||||
|
||||
* lua-mashal for faster serialization/deserialization of data
|
||||
@ -88,6 +95,26 @@ Available worlds will be converted to 'lsqlite3', but there is no way back, so:
|
||||
|
||||
### History
|
||||
|
||||
**2023-08-25 V1.17**
|
||||
|
||||
- Add support for doclib / remove techage internal doc support
|
||||
**The mod doclib is a new hard depenency !**
|
||||
- Fix LICENCSE file bug
|
||||
- Add beduino support for TA3 repeater (realmicu)
|
||||
- Add inv_name_prefix to `techage.register_consumer` (debiankaios)
|
||||
- Add generator menu to TA5 generator (fusion reactor)
|
||||
- Adapt mod to the new lcdlib mod
|
||||
- Fix some bugs
|
||||
|
||||
**2023-06-30 V1.16**
|
||||
|
||||
- Add TA4 node detector
|
||||
- Add wrench menu to TA3 button
|
||||
- Add arrows to the pump bottom and allow to turn the pump with the Techage Screwdriver
|
||||
- Fix bug with configurred TA4 chest and TA5 teleport tubes
|
||||
- Add gaze sensor
|
||||
- Many bugfixes and improvements
|
||||
|
||||
**2023-05-05 V1.15**
|
||||
|
||||
- Allow energy storage with up to 13x13x13 concrete blocks
|
||||
@ -117,7 +144,7 @@ Available worlds will be converted to 'lsqlite3', but there is no way back, so:
|
||||
- add wrench menu for 'max. power passed through'
|
||||
- Increase max. power passed through from 100 to 300 ku
|
||||
- Improve Electricmeter:
|
||||
- add wrench menu for 'max. power passed through' and 'power countdown'
|
||||
- add wrench menu for 'max. power passed through' and 'power countdown' 2458
|
||||
- add commands to read the countdown value (Lua and Beduino controller)
|
||||
- Improve TA3 Mesecons Converter:
|
||||
- fix overload bug
|
||||
|
@ -113,16 +113,21 @@ end
|
||||
|
||||
-- 'validStates' is optional and can be used to e.g. enable
|
||||
-- only one TA2 node {false, true, false, false}
|
||||
function techage.register_consumer(base_name, inv_name, tiles, tNode, validStates, node_name_prefix)
|
||||
function techage.register_consumer(base_name, inv_name, tiles, tNode, validStates, node_name_prefix, inv_name_prefix)
|
||||
local names = {}
|
||||
validStates = validStates or {true, true, true, true}
|
||||
if not node_name_prefix then
|
||||
node_name_prefix = "techage:ta"
|
||||
|
||||
node_name_prefix = node_name_prefix or "techage:ta"
|
||||
if inv_name_prefix then
|
||||
inv_name_prefix = inv_name_prefix.." "
|
||||
else
|
||||
inv_name_prefix = ""
|
||||
end
|
||||
|
||||
for stage = 2,5 do
|
||||
local name_pas = node_name_prefix..stage.."_"..base_name.."_pas"
|
||||
local name_act = node_name_prefix..stage.."_"..base_name.."_act"
|
||||
local name_inv = "TA"..stage.." "..inv_name
|
||||
local name_inv = inv_name_prefix.."TA"..stage.." "..inv_name
|
||||
names[#names+1] = name_pas
|
||||
|
||||
if validStates[stage] then
|
||||
|
@ -3,7 +3,7 @@
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019-2022 Joachim Stolberg
|
||||
Copyright (C) 2019-2023 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
@ -31,7 +31,7 @@ local STANDBY_TICKS = 4
|
||||
local COUNTDOWN_TICKS = 4
|
||||
|
||||
local Side2Facedir = {F=0, R=1, B=2, L=3, D=4, U=5}
|
||||
local Depth2Idx = {[1]=1 ,[2]=2, [3]=3, [5]=4, [10]=5, [15]=6, [20]=7, [25]=8, [40]=9, [60]=10, [80]=11}
|
||||
local Depth2Idx = {[1]=1 ,[2]=2, [3]=3, [5]=4, [7]=5, [10]=6, [15]=7, [20]=8, [25]=9, [40]=10, [60]=11, [80]=12}
|
||||
local Holesize2Idx = {["3x3"] = 1, ["5x5"] = 2, ["7x7"] = 3, ["9x9"] = 4, ["11x11"] = 5}
|
||||
local Holesize2Diameter = {["3x3"] = 3, ["5x5"] = 5, ["7x7"] = 7, ["9x9"] = 9, ["11x11"] = 11}
|
||||
local Level2Idx = {[2]=1, [1]=2, [0]=3, [-1]=4, [-2]=5, [-3]=6,
|
||||
@ -46,12 +46,14 @@ local function formspec(self, pos, nvm)
|
||||
local hsize_list = "5x5"
|
||||
if CRD(pos).stage == 4 then
|
||||
hsize_list = "3x3,5x5,7x7,9x9,11x11"
|
||||
elseif CRD(pos).stage == 3 then
|
||||
hsize_list = "3x3,5x5,7x7"
|
||||
end
|
||||
local depth_list = "1,2,3,5,10,15,20,25,40,60,80"
|
||||
local depth_list = "1,2,3,5,7,10,15,20,25,40,60,80"
|
||||
if CRD(pos).stage == 3 then
|
||||
depth_list = "1,2,3,5,10,15,20,25,40"
|
||||
depth_list = "1,2,3,5,7,10,15,20,25,40"
|
||||
elseif CRD(pos).stage == 2 then
|
||||
depth_list = "1,2,3,5,10,15,20"
|
||||
depth_list = "1,2,3,5,7,10,15,20"
|
||||
end
|
||||
|
||||
return "size[8,8]"..
|
||||
@ -241,7 +243,7 @@ local function keep_running(pos, elapsed)
|
||||
local crd = CRD(pos)
|
||||
local _, err = coroutine.resume(mem.co, pos, crd, nvm)
|
||||
if err then
|
||||
minetest.log("error", "[TA4 Quarry Coroutine Error]" .. err)
|
||||
minetest.log("error", "[TA4 Quarry Coroutine Error] at pos " .. minetest.pos_to_string(pos) .. " " .. err)
|
||||
end
|
||||
|
||||
if techage.is_activeformspec(pos) then
|
||||
@ -302,6 +304,13 @@ local function on_receive_fields(pos, formname, fields, player)
|
||||
mem.co = nil
|
||||
CRD(pos).State:stop(pos, nvm)
|
||||
end
|
||||
elseif CRD(pos).stage == 3 then
|
||||
if fields.hole_size ~= nvm.hole_size then
|
||||
nvm.hole_size = fields.hole_size
|
||||
nvm.hole_diameter = Holesize2Diameter[fields.hole_size or "7x7"] or 7
|
||||
mem.co = nil
|
||||
CRD(pos).State:stop(pos, nvm)
|
||||
end
|
||||
else
|
||||
nvm.hole_size = "5x5"
|
||||
nvm.hole_diameter = 5
|
||||
|
@ -115,7 +115,7 @@ end
|
||||
local function cook_reverse(stack, inv, idx, recipe)
|
||||
-- check space
|
||||
for _,item in ipairs(recipe.items) do
|
||||
if not inv:room_for_item("dst", stack) then
|
||||
if not inv:room_for_item("dst", item) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
@ -516,7 +516,8 @@ minetest.register_entity("techage:move_item", {
|
||||
self.old_dist = self.old_dist or dist
|
||||
|
||||
if self.lmove and self.lmove[self.path_idx] then
|
||||
if dist < 1 or dist > self.old_dist then
|
||||
local min_dist = math.min(1, self.max_speed / 8)
|
||||
if dist < min_dist or dist > self.old_dist then
|
||||
-- change of direction
|
||||
local next_pos = stop_obj(obj, self)
|
||||
if not moveon_entity(obj, self, next_pos) then
|
||||
@ -565,7 +566,7 @@ local function is_simple_node(pos)
|
||||
local node = techage.get_node_lvm(pos)
|
||||
if not minecart.is_rail(pos, node.name) then
|
||||
local ndef = minetest.registered_nodes[node.name]
|
||||
return not techage.is_air_like(node.name) and techage.can_dig_node(node.name, ndef) or minecart.is_cart(node.name)
|
||||
return node.name ~= "air" and techage.can_dig_node(node.name, ndef) or minecart.is_cart(node.name)
|
||||
end
|
||||
end
|
||||
|
||||
@ -642,16 +643,20 @@ local function multi_move_nodes(pos, meta, nvm, lmove, max_speed, height, move2t
|
||||
else
|
||||
if not is_simple_node(pos1) then
|
||||
meta:set_string("status", S("No valid node at the start position"))
|
||||
minetest.chat_send_player(owner, " [techage] " .. S("No valid node at the start position") .. " at " .. P2S(pos1))
|
||||
else
|
||||
meta:set_string("status", S("No valid destination position"))
|
||||
minetest.chat_send_player(owner, " [techage] " .. S("No valid destination position") .. " at " .. P2S(pos2))
|
||||
end
|
||||
return false
|
||||
end
|
||||
else
|
||||
if minetest.is_protected(pos1, owner) then
|
||||
meta:set_string("status", S("Start position is protected"))
|
||||
minetest.chat_send_player(owner, " [techage] " .. S("Start position is protected") .. " at " .. P2S(pos1))
|
||||
else
|
||||
meta:set_string("status", S("Destination position is protected"))
|
||||
minetest.chat_send_player(owner, " [techage] " .. S("Destination position is protected") .. " at " .. P2S(pos2))
|
||||
end
|
||||
return false
|
||||
end
|
||||
@ -684,16 +689,20 @@ local function move_nodes(pos, meta, lpos1, move, max_speed, height)
|
||||
else
|
||||
if not is_simple_node(pos1) then
|
||||
meta:set_string("status", S("No valid node at the start position"))
|
||||
minetest.chat_send_player(owner, " [techage] " .. S("No valid node at the start position") .. " at " .. P2S(pos1))
|
||||
else
|
||||
meta:set_string("status", S("No valid destination position"))
|
||||
minetest.chat_send_player(owner, " [techage] " .. S("No valid destination position") .. " at " .. P2S(pos2))
|
||||
end
|
||||
return false, lpos1
|
||||
end
|
||||
else
|
||||
if minetest.is_protected(pos1, owner) then
|
||||
meta:set_string("status", S("Start position is protected"))
|
||||
minetest.chat_send_player(owner, " [techage] " .. S("Start position is protected") .. " at " .. P2S(pos1))
|
||||
else
|
||||
meta:set_string("status", S("Destination position is protected"))
|
||||
minetest.chat_send_player(owner, " [techage] " .. S("Destination position is protected") .. " at " .. P2S(pos2))
|
||||
end
|
||||
return false, lpos1
|
||||
end
|
||||
@ -729,16 +738,20 @@ local function teleport(base_pos, pos1, pos2, meta, owner, lmove, max_speed)
|
||||
else
|
||||
if not techage.is_air_like(node1.name) then
|
||||
meta:set_string("status", S("No valid start position"))
|
||||
minetest.chat_send_player(owner, " [techage] " .. S("No valid start position") .. " at " .. P2S(pos1))
|
||||
else
|
||||
meta:set_string("status", S("No valid destination position"))
|
||||
minetest.chat_send_player(owner, " [techage] " .. S("No valid destination position") .. " at " .. P2S(pos2))
|
||||
end
|
||||
return false
|
||||
end
|
||||
else
|
||||
if minetest.is_protected(pos1, owner) then
|
||||
meta:set_string("status", S("Start position is protected"))
|
||||
minetest.chat_send_player(owner, " [techage] " .. S("Start position is protected") .. " at " .. P2S(pos1))
|
||||
else
|
||||
meta:set_string("status", S("Destination position is protected"))
|
||||
minetest.chat_send_player(owner, " [techage] " .. S("Destination position is protected") .. " at " .. P2S(pos2))
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
@ -12,6 +12,7 @@
|
||||
|
||||
]]--
|
||||
|
||||
local MAX_NUM = 128
|
||||
local marker = {}
|
||||
|
||||
local MarkedNodes = {} -- t[player] = {{entity, pos},...}
|
||||
@ -59,7 +60,7 @@ function marker.get_poslist(name)
|
||||
for _,item in ipairs(MarkedNodes[name] or {}) do
|
||||
table.insert(lst, item.pos)
|
||||
idx = idx + 1
|
||||
if idx >= 16 then break end
|
||||
if idx >= MAX_NUM then break end
|
||||
end
|
||||
return lst
|
||||
end
|
||||
|
@ -307,3 +307,8 @@ function techage.menu.eval_input(pos, form_def, fields, player_name)
|
||||
end
|
||||
return fields.refresh or fields.save or fields.key_enter_field
|
||||
end
|
||||
|
||||
function techage.dropdown_index(sChoices, selected_value)
|
||||
local l = sChoices:split(",")
|
||||
return index(l, selected_value) or 1
|
||||
end
|
||||
|
@ -21,9 +21,9 @@ local getpos = techage.assemble.get_pos
|
||||
|
||||
local CYCLE_TIME = 2
|
||||
local TNO_MAGNETS = 22
|
||||
local IMPROBABILITY = 60 -- every 60 min
|
||||
-- one point per 60 min: check every 20 s => factor = 60 * 3 = 180
|
||||
IMPROBABILITY = (minetest.settings:get("techage_expoint_rate_in_min") or 60) * 3
|
||||
local IMPROBABILITY = 40 -- every 40 min
|
||||
-- one point per 40 min: check every 20 s => factor = 40 * 3 = 120
|
||||
IMPROBABILITY = (minetest.settings:get("techage_expoint_rate_in_min") or 40) * 3
|
||||
|
||||
local TIME_SLOTS = 10
|
||||
local Schedule = {[0] =
|
||||
|
@ -50,7 +50,6 @@ minetest.register_node("techage:ta4_detector_magnet", {
|
||||
"techage_collider_magnet.png^techage_collider_magnet_appl.png",
|
||||
"techage_collider_magnet.png^techage_collider_magnet_appl.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky = 1},
|
||||
is_ground_content = false,
|
||||
|
@ -139,7 +139,6 @@ minetest.register_node("techage:ta4_collider_detector_worker", {
|
||||
"default_steel_block.png^techage_collider_detector_banner.png",
|
||||
"default_steel_block.png^techage_collider_detector_appl.png^techage_collider_detector_banner.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky = 1},
|
||||
on_rotate = screwdriver.disallow,
|
||||
|
@ -3,123 +3,46 @@
|
||||
]]--
|
||||
|
||||
local S = techage.S
|
||||
local M = minetest.get_meta
|
||||
local MP = minetest.get_modpath("techage")
|
||||
|
||||
local tItems = techage.Items -- k/v table with item definitions
|
||||
local tPlans = techage.ConstructionPlans -- k/v table with plan definitions
|
||||
local settings = {
|
||||
symbol_item = "techage:construction_board",
|
||||
}
|
||||
|
||||
doclib.create_manual("techage", "DE", settings)
|
||||
doclib.create_manual("techage", "EN", settings)
|
||||
|
||||
local function tooltip(item)
|
||||
if type(item) == "table" then
|
||||
local img, name = item[1], item[2]
|
||||
if img == "" then -- larger image for the plan?
|
||||
return "", name
|
||||
elseif img == "10x10" then -- huge image for the plan?
|
||||
return "10x10", name
|
||||
elseif img == "5x4" then -- huge image for the plan?
|
||||
return "5x4", name
|
||||
end
|
||||
local ndef = minetest.registered_nodes[name]
|
||||
if ndef and ndef.description then
|
||||
return img, minetest.formspec_escape(ndef.description)
|
||||
end
|
||||
return img
|
||||
end
|
||||
return item
|
||||
end
|
||||
local content
|
||||
content = dofile(MP.."/doc/manual_DE.lua")
|
||||
doclib.add_to_manual("techage", "DE", content)
|
||||
content = dofile(MP.."/doc/manual_ta1_DE.lua")
|
||||
doclib.add_to_manual("techage", "DE", content)
|
||||
content = dofile(MP.."/doc/manual_ta2_DE.lua")
|
||||
doclib.add_to_manual("techage", "DE", content)
|
||||
content = dofile(MP.."/doc/manual_ta3_DE.lua")
|
||||
doclib.add_to_manual("techage", "DE", content)
|
||||
content = dofile(MP.."/doc/manual_ta4_DE.lua")
|
||||
doclib.add_to_manual("techage", "DE", content)
|
||||
content = dofile(MP.."/doc/manual_ta5_DE.lua")
|
||||
doclib.add_to_manual("techage", "DE", content)
|
||||
|
||||
content = dofile(MP.."/doc/manual_EN.lua")
|
||||
doclib.add_to_manual("techage", "EN", content)
|
||||
content = dofile(MP.."/doc/manual_ta1_EN.lua")
|
||||
doclib.add_to_manual("techage", "EN", content)
|
||||
content = dofile(MP.."/doc/manual_ta2_EN.lua")
|
||||
doclib.add_to_manual("techage", "EN", content)
|
||||
content = dofile(MP.."/doc/manual_ta3_EN.lua")
|
||||
doclib.add_to_manual("techage", "EN", content)
|
||||
content = dofile(MP.."/doc/manual_ta4_EN.lua")
|
||||
doclib.add_to_manual("techage", "EN", content)
|
||||
content = dofile(MP.."/doc/manual_ta5_EN.lua")
|
||||
doclib.add_to_manual("techage", "EN", content)
|
||||
|
||||
-- formspec images
|
||||
local function plan(images)
|
||||
local tbl = {}
|
||||
if images == "none" then return "label[1,3;"..S("No plan available") .."]" end
|
||||
for y=1,#images do
|
||||
for x=1,#images[1] do
|
||||
local item = images[y][x] or false
|
||||
if item ~= false then
|
||||
local img, tooltip = tooltip(item)
|
||||
local x_offs, y_offs = (x-1) * 0.9, (y-1) * 0.9 + 0.8
|
||||
if img == "top_view" then
|
||||
tbl[#tbl+1] = "label["..x_offs..","..y_offs..";"..S("Top view").."]"
|
||||
elseif img == "side_view" then
|
||||
tbl[#tbl+1] = "label["..x_offs..","..y_offs..";"..S("Side view").."]"
|
||||
elseif img == "sectional_view" then
|
||||
tbl[#tbl+1] = "label["..x_offs..","..y_offs..";"..S("Sectional view").."]"
|
||||
elseif img == "" then
|
||||
img = tooltip -- use tooltip for bigger image
|
||||
tbl[#tbl+1] = "image["..x_offs..","..y_offs..";2.2,2.2;"..img.."]"
|
||||
elseif img == "10x10" then
|
||||
img = tooltip -- use tooltip for bigger image
|
||||
tbl[#tbl+1] = "image["..x_offs..","..y_offs..";10,10;"..img.."]"
|
||||
elseif img == "5x4" then
|
||||
img = tooltip -- use tooltip for bigger image
|
||||
tbl[#tbl+1] = "image["..x_offs..","..y_offs..";5,4;"..img.."]"
|
||||
elseif string.find(img, ":") then
|
||||
tbl[#tbl+1] = "item_image["..x_offs..","..y_offs..";1,1;"..img.."]"
|
||||
else
|
||||
tbl[#tbl+1] = "image["..x_offs..","..y_offs..";1,1;"..img.."]"
|
||||
end
|
||||
if tooltip then
|
||||
tbl[#tbl+1] = "tooltip["..x_offs..","..y_offs..";1,1;"..tooltip..";#0C3D32;#FFFFFF]"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return table.concat(tbl)
|
||||
end
|
||||
|
||||
local function formspec_help(meta, manual)
|
||||
local bttn
|
||||
local idx = meta:get_int("index")
|
||||
local box = "box[9.5,0.9;1,1.1;#BBBBBB]"
|
||||
local aTitel = manual.aTitel
|
||||
local aText = manual.aText
|
||||
local aItemName = manual.aItemName -- item identifier as key
|
||||
local aPlanTable = manual.aPlanTable -- plan identifier as key
|
||||
|
||||
if aPlanTable[idx] ~= "" then
|
||||
bttn = "button[9.6,1;1,1;plan;"..S("Plan").."]"
|
||||
elseif aItemName[idx] ~= "" then
|
||||
local item = tItems[aItemName[idx]] or ""
|
||||
if string.find(item, ":") then
|
||||
bttn = box.."item_image[9.6,1;1,1;"..item.."]"
|
||||
else
|
||||
bttn = "image[9.3,1;2,2;"..item.."]"
|
||||
end
|
||||
else
|
||||
bttn = box
|
||||
end
|
||||
return "size[11,10]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img..
|
||||
default.gui_slots..
|
||||
"item_image[9.6,0;1,1;techage:construction_board]"..
|
||||
"tablecolumns[tree,width=1;text,width=10,align=inline]"..
|
||||
"tableoptions[opendepth=1]"..
|
||||
"table[0.1,0;9,5;page;"..table.concat(aTitel, ",")..";"..idx.."]"..
|
||||
bttn..
|
||||
"box[0,5.75;10.775,4.45;#000000]"..
|
||||
"style_type[textarea;textcolor=#FFFFFF]"..
|
||||
"textarea[0.3,5.7;11,5.3;;"..(aText[idx] or "")..";]"
|
||||
end
|
||||
|
||||
local function formspec_plan(meta, manual)
|
||||
local idx = meta:get_int("index")
|
||||
local images = tPlans[manual.aPlanTable[idx]] or "none"
|
||||
local titel = string.sub(manual.aTitel[idx], 3) or "unknown"
|
||||
|
||||
return "size[11,10]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img..
|
||||
default.gui_slots..
|
||||
"label[0,0;"..titel..":]"..
|
||||
"button[10,0;1,0.8;back;<<]"..
|
||||
plan(images)
|
||||
end
|
||||
|
||||
local board_box = {
|
||||
type = "wallmounted",
|
||||
--wall_top = {-8/16, 15/32, -6/16, 8/16, 8/16, 6/16},
|
||||
--wall_bottom = {-8/16, 15/32, -6/16, 8/16, 8/16, 6/16},
|
||||
wall_side = {-16/32, -11/32, -16/32, -15/32, 6/16, 8/16},
|
||||
}
|
||||
|
||||
@ -132,9 +55,8 @@ minetest.register_node("techage:construction_board", {
|
||||
selection_box = board_box,
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_int("index", 1)
|
||||
meta:set_string("formspec", formspec_help(meta, techage.manual_DE))
|
||||
M(pos):set_string("infotext", "TA Konstruktionsplan (DE)")
|
||||
M(pos):set_string("formspec", doclib.formspec(pos, "techage", "DE"))
|
||||
end,
|
||||
|
||||
on_receive_fields = function(pos, formname, fields, player)
|
||||
@ -142,19 +64,7 @@ minetest.register_node("techage:construction_board", {
|
||||
if minetest.is_protected(pos, player_name) then
|
||||
return
|
||||
end
|
||||
local meta = minetest.get_meta(pos)
|
||||
if fields.plan then
|
||||
meta:set_string("formspec", formspec_plan(meta, techage.manual_DE))
|
||||
elseif fields.back then
|
||||
meta:set_string("formspec", formspec_help(meta, techage.manual_DE))
|
||||
elseif fields.page then
|
||||
local evt = minetest.explode_table_event(fields.page)
|
||||
if evt.type == "CHG" then
|
||||
local idx = tonumber(evt.row)
|
||||
meta:set_int("index", idx)
|
||||
meta:set_string("formspec", formspec_help(meta, techage.manual_DE))
|
||||
end
|
||||
end
|
||||
M(pos):set_string("formspec", doclib.formspec(pos, "techage", "DE", fields))
|
||||
end,
|
||||
|
||||
paramtype2 = "wallmounted",
|
||||
@ -184,9 +94,8 @@ minetest.register_node("techage:construction_board_EN", {
|
||||
selection_box = board_box,
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_int("index", 1)
|
||||
meta:set_string("formspec", formspec_help(meta, techage.manual_EN))
|
||||
M(pos):set_string("infotext", "TA Konstruktionsplan (EN)")
|
||||
M(pos):set_string("formspec", doclib.formspec(pos, "techage", "EN"))
|
||||
end,
|
||||
|
||||
on_receive_fields = function(pos, formname, fields, player)
|
||||
@ -194,19 +103,7 @@ minetest.register_node("techage:construction_board_EN", {
|
||||
if minetest.is_protected(pos, player_name) then
|
||||
return
|
||||
end
|
||||
local meta = minetest.get_meta(pos)
|
||||
if fields.plan then
|
||||
meta:set_string("formspec", formspec_plan(meta, techage.manual_EN))
|
||||
elseif fields.back then
|
||||
meta:set_string("formspec", formspec_help(meta, techage.manual_EN))
|
||||
elseif fields.page then
|
||||
local evt = minetest.explode_table_event(fields.page)
|
||||
if evt.type == "CHG" then
|
||||
local idx = tonumber(evt.row)
|
||||
meta:set_int("index", idx)
|
||||
meta:set_string("formspec", formspec_help(meta, techage.manual_EN))
|
||||
end
|
||||
end
|
||||
M(pos):set_string("formspec", doclib.formspec(pos, "techage", "EN", fields))
|
||||
end,
|
||||
|
||||
paramtype2 = "wallmounted",
|
||||
@ -238,3 +135,26 @@ minetest.register_craft({
|
||||
output = "techage:construction_board",
|
||||
recipe = {"techage:construction_board_EN"},
|
||||
})
|
||||
|
||||
|
||||
--
|
||||
-- Legacy API functions
|
||||
--
|
||||
function techage.add_to_manual(language, titles, texts, items, plans)
|
||||
local content = {titles = titles, texts = texts, images = items or {}, plans = plans or {}}
|
||||
doclib.add_to_manual("techage", language, content)
|
||||
end
|
||||
|
||||
function techage.add_manual_items(table_with_items)
|
||||
for name, image in pairs(table_with_items) do
|
||||
doclib.add_manual_image("techage", "EN", name, image)
|
||||
doclib.add_manual_image("techage", "DE", name, image)
|
||||
end
|
||||
end
|
||||
|
||||
function techage.add_manual_plans(table_with_plans)
|
||||
for name, plan in pairs(table_with_plans) do
|
||||
doclib.add_manual_plan("techage", "EN", name, plan)
|
||||
doclib.add_manual_plan("techage", "DE", name, plan)
|
||||
end
|
||||
end
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
]]--
|
||||
|
||||
techage.Items = {
|
||||
local items = {
|
||||
techage_ta1 = "techage_ta1.png",
|
||||
iron = "techage:iron_ingot",
|
||||
charcoal = "techage:charcoal",
|
||||
@ -126,6 +126,8 @@ techage.Items = {
|
||||
ta3_valve = "techage:ta3_valve_closed",
|
||||
ta3_motor = "techage:ta3_motor_off",
|
||||
ta3_injector = "techage:ta3_injector_pas",
|
||||
ta3_command_converter = "techage:ta3_command_converter_off",
|
||||
ta3_flipflop = "techage:ta3_flipflop_off",
|
||||
----------------------------
|
||||
techage_ta4 = "techage_ta4.png",
|
||||
techage_ta4c = "techage_ta4c.png",
|
||||
@ -204,6 +206,9 @@ techage.Items = {
|
||||
ta4_terminal = "techage:terminal3",
|
||||
ta4_autocrafter = "techage:ta4_autocrafter_pas",
|
||||
ta4_recipeblock = "techage:ta4_recipeblock",
|
||||
ta4_chargedetector = "techage:ta4_chargedetector_off",
|
||||
ta4_gaze_sensor = "techage:ta4_gaze_sensor_off",
|
||||
ta4_nodedetector = "techage:ta4_nodedetector_off",
|
||||
----------------------------
|
||||
techage_ta5 = "techage:ta5_fr_nucleus",
|
||||
ta5_flycontroller = "techage:ta5_flycontroller",
|
||||
@ -220,8 +225,7 @@ techage.Items = {
|
||||
ta5_fr_controller = "techage:ta5_fr_controller_pas",
|
||||
}
|
||||
|
||||
function techage.add_manual_items(table_with_items)
|
||||
for name, tbl in pairs(table_with_items) do
|
||||
techage.Items[name] = tbl
|
||||
end
|
||||
for name, image in pairs(items) do
|
||||
doclib.add_manual_image("techage", "DE", name, image)
|
||||
doclib.add_manual_image("techage", "EN", name, image)
|
||||
end
|
||||
|
@ -1,39 +0,0 @@
|
||||
--[[
|
||||
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019-2020 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
API to add further chapters to the manuals
|
||||
|
||||
]]--
|
||||
|
||||
function techage.add_to_manual(language, titles, texts, items, plans)
|
||||
local tbl
|
||||
|
||||
if language == "DE" then
|
||||
tbl = techage.manual_DE
|
||||
elseif language == "EN" then
|
||||
tbl = techage.manual_EN
|
||||
else
|
||||
minetest.log("error", "[techage] Invalid manual language provided for 'techage.add_to_manual'!")
|
||||
return
|
||||
end
|
||||
|
||||
for _, item in ipairs(titles) do
|
||||
tbl.aTitel[#tbl.aTitel + 1] = item
|
||||
end
|
||||
for _, item in ipairs(texts) do
|
||||
tbl.aText[#tbl.aText + 1] = item
|
||||
end
|
||||
for _, item in ipairs(items) do
|
||||
tbl.aItemName[#tbl.aItemName + 1] = item
|
||||
end
|
||||
for _, item in ipairs(plans) do
|
||||
tbl.aPlanTable[#tbl.aPlanTable + 1] = item
|
||||
end
|
||||
end
|
172
techage/doc/manual_ta1_DE.lua
Normal file
@ -0,0 +1,172 @@
|
||||
return {
|
||||
titles = {
|
||||
"1,TA1: Eisenzeitalter",
|
||||
"2,Köhler / Coal Pile",
|
||||
"2,Kohlebrenner / Coal Burner",
|
||||
"2,Wassermühle",
|
||||
"3,TA1 Mühle",
|
||||
"3,TA1 Schleusenschieber / TA1 Sluice Gate",
|
||||
"3,TA1 Schleusengriff / TA1 Sluice Handle",
|
||||
"3,TA1 Apfelholzbrett / TA1 Apple Wood Board",
|
||||
"3,TA1 Apfel Mühlbachbrett / TA1 Apple Millrace Board",
|
||||
"2,Erze und Werkzeuge",
|
||||
"3,Hammer",
|
||||
"3,Kiessieb / Gravel Sieve",
|
||||
"3,Trichter / Hopper",
|
||||
"3,Kies sieben mit dem Trichter",
|
||||
"3,Meridium",
|
||||
},
|
||||
texts = {
|
||||
"In TA1 geht es darum\\, mit einfachen Werkzeugen und Gerätschaften ausreichend Erze zu schürfen und Holzkohle herzustellen\\, so dass damit TA2 Maschinen hergestellt und betrieben werden können.\n"..
|
||||
"\n"..
|
||||
"Natürlich muss es für ein Eisenzeitalter auch Eisen geben und nicht nur Stahl (steel)\\, wie in \"Minetest Game\". Daher wurden einige Rezepte geändert\\, so dass zuerst Eisen hergestellt werden muss und erst später dann Stahl.\n"..
|
||||
"\n"..
|
||||
"Auch ist die Haltbarkeit der Werkzeuge an die Zeitalter angelehnt und entspricht damit nicht dem Minetest Originalspiel.\n"..
|
||||
"Die Haltbarkeit/Härte bspw. für eine Axt ist:\n"..
|
||||
"\n"..
|
||||
" - Bronze: 20\n"..
|
||||
" - Stahl: 30\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Den Köhler brauchst du\\, um Holzkohle herzustellen. Holzkohle wird für den Brenner\\, aber auch bspw. in TA2 für die Dampfmaschine benötigt.\n"..
|
||||
"\n"..
|
||||
"Für den Köhler brauchst du:\n"..
|
||||
"\n"..
|
||||
" - einen Anzünderblock ('techage:lighter')\n"..
|
||||
" - 26 Hölzblöcke (wood)\\, die zu einem Würfen aufgeschichtet werden. Die Holzsorte spielt keine Rolle.\n"..
|
||||
" - Erde (dirt) um den Holzhaufen abzudecken.\n"..
|
||||
" - Feuerstein und Eisen (technischer Name: 'fire:flint_and_steel') um den Anzünderblock anzuzünden.\n"..
|
||||
"\n"..
|
||||
"Bauanleitung (siehe auch Plan):\n"..
|
||||
"\n"..
|
||||
" - Baue eine 5x5 große Fläche aus Erde (dirt)\n"..
|
||||
" - Platziere in die Mitte einen Anzünder (lighter)\n"..
|
||||
" - Platziere rund um den Anzünder 7 Holz (wood)\\, aber lasse ein Loch zum Anzünder frei\n"..
|
||||
" - Baue weitere 2 Schichten Holz darüber\\, so dass ein 3x3x3 großer Holzwürfel entsteht\n"..
|
||||
" - Überdecke alles mit einer Schicht Erde zu einem 5x5x5 großen Würfel\\, aber lasse das Loch zum Anzünder frei\n"..
|
||||
" - Entzünde den Anzünder und verschließe das Loch sofort mit jeweils einem Block Holz und Erde\n"..
|
||||
" - Wenn du alles richtig gemacht hast\\, fängt der Köhler nach wenigen Sekunden an zu rauchen\n"..
|
||||
" - Öffne den Köhler erst\\, wenn der Rauch verschwunden ist (ca. 20 min)\n"..
|
||||
"\n"..
|
||||
"Dann kannst du die 9 Holzkohleblöcke entnehmen und den Köhler erneut füllen.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Den Kohlebrenner benötigst du bspw. um Eisen und andere Erze im Schmelztiegel zu schmelzen. Es gibt verschiedene Rezepte\\, welche verschiedene Temperaturen benötigen. Je höher der Turm\\, um so heißer ist die Flamme. Eine Höhe von 11 Blöcken über der Bodenplatte ist für alle Rezepte ausreichend\\, ein Brenner mit dieser Höhe verbraucht aber auch mehr Holzkohle.\n"..
|
||||
"\n"..
|
||||
"Bauanleitung (siehe auch Plan):\n"..
|
||||
"\n"..
|
||||
" - Baue einen Turm aus Stein (cobble) mit einer 3x3 Grundfläche (7-11 Blöcke hoch)\n"..
|
||||
" - Lasse unten ein Loch an einer Seite offen\n"..
|
||||
" - Lege einen Anzünder (lighter) hinein\n"..
|
||||
" - Fülle den Turm bis zum Rand mit Holzkohle\\, in dem du die Holzkohle von oben in das Loch fallen lässt\n"..
|
||||
" - Entzünde den Anzünder durch das Loch\n"..
|
||||
" - Platziere den Schmelztiegel oben auf dem Turm direkt in die Flamme\\, einen Block über dem Turmrand\n"..
|
||||
" - Um den Brenner anzuhalten\\, schließe das Loch vorübergehend bspw. mit einem Erdblock.\n"..
|
||||
"\n"..
|
||||
"Der Schmelztiegel hat ein eigenes Menü mit Rezepten und ein Inventar\\, wo du die Erze hinein legst.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit der Wassermühle können Weizen und andere Getreide zu Mehl gemahlen und dann im Ofen zu Brot gebacken werden. Die Mühle wird mit\n"..
|
||||
"Wasserkraft angetrieben. Dazu muss ein Mühlbach über einen Kanal zum Mühlrad geführt werden.\n"..
|
||||
"Über eine Schleuse kann der Wasserfluss und damit das Mühlrad gesteuert werden.\n"..
|
||||
"Die Schleuse besteht aus Schleusenschieber und Schleusengriff.\n"..
|
||||
"\n"..
|
||||
"Die Abbildung rechts (auf \"Plan\" klicken) zeigt den Aufbau der Wassermühle.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit der Wassermühle können Weizen und andere Getreide zu Mehl gemahlen und dann im Ofen zu Brot gebacken werden.\n"..
|
||||
"Die Mühle muss mit einer TA1 Achse mit dem Mühlrad verbunden werden. Die Kraft des Mühlrades reicht nur für eine Mühle.\n"..
|
||||
"\n"..
|
||||
"Die Mühle kann mit Hilfe eines Minecart Hoppers automatisiert werden\\, so dass das Mehl bspw. direkt von der Mühle in einen Ofen befördert wird\\, um daraus Brot zu backen.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Schleusenschieber muss auf gleicher Höhe wie die Wasseroberfläche direkt an einen Teich oder in einen Bach gesetzt werden.\n"..
|
||||
"Wird die Schleuse geöffnet\\, so fließt Wasser durch den Schieber. Dieses Wasser muss dann zum Mühlrad geleitet werden und treibt dort die Mühle an.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der TA1 Schleusengriff muss auf den Schleusenschieber gesetzt werden. Mit Hilfe des Schleusengriffs (Rechtsklick) kann der Schieber geöffnet werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Block in verschiedenen Holzsorten zum Bauen des Mühlbachkanals. Es kann aber auch jedes andere Material verwendet werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Block in verschiedenen Holzsorten zum Bauen des Mühlbachkanals. Dieser Block eignet sich speziell in Verbindung mit den Pfosten des Holzzauns um eine Stütze für den Kanal zu bauen.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"TA1 hat seine eigenen Werkzeuge wie Hammer und Kiessieb\\, aber auch der Minecart Hopper kann genutzt werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit dem TA1 Hammer können Steine (stone) und Kopfsteinpflaster-Steine (cobble) zu Kies (gravel) zertrümmert werden. Der Hammer ist in verschiedenen Ausführungen und damit verschiedenen Eigenschaften verfügbar: Bronze\\, Stahl\\, Mese und Diamant.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit dem Kiessieb können Erze aus dem Kies gesiebt werden. Dazu mit dem Kies (gravel) auf das Sieb klicken. Der gesiebte Kies und die Erze fallen unten heraus.\n"..
|
||||
"\n"..
|
||||
"Um hier nicht stundenlang am Sieb zu stehen\\, kann das Sieben mit dem Trichter (hopper) automatisiert werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Hopper aus der Mod \"Minecart\" dient in erster Linie zum Be- und Entladen von Minecarts. Er saugt Gegenstände (items) von oben ein und gibt diese nach rechts weiter. Beim Platzieren des Trichters muss daher auf die Ausgaberichtung geachtet werden.\n"..
|
||||
"\n"..
|
||||
"Der Trichter kann aber auch Items aus Kisten (chest) ziehen\\, sofern die Kiste neben oder auf dem Trichter steht. \n"..
|
||||
"\n"..
|
||||
"Der Trichter kann auch Items in Kisten legen\\, sofern die Kiste neben dem Trichter steht.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit Hilfe von zwei Kisten\\, zwei Trichtern und einem Kiessieb kann der Siebevorgang automatisiert werden. Der Plan rechts zeigt den Aufbau.\n"..
|
||||
"\n"..
|
||||
"Bei den Kisten darauf achten\\, dass es die \"chest_locked\" ist\\, sonst klaut dir jemand die wertvollen Erze aus der Kiste unten.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"TA1 hat seine eigene Metalllegierung Meridium. Meridium Ingots können mit dem Kohlebrenner aus Stahl und Mesesplittern hergestellt werden. Meridium leuchtet im Dunkeln. Auch Werkzeuge aus Meridium leuchten und sind daher im Untertagebau sehr hilfreich.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
},
|
||||
images = {
|
||||
"techage_ta1",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta1_sluice",
|
||||
"ta1_sluice_handle",
|
||||
"ta1_board1",
|
||||
"ta1_board2",
|
||||
"ta1_gravelsieve",
|
||||
"hammer",
|
||||
"ta1_gravelsieve",
|
||||
"ta1_hopper",
|
||||
"",
|
||||
"meridium",
|
||||
},
|
||||
plans = {
|
||||
"",
|
||||
"coalpile",
|
||||
"coalburner",
|
||||
"watermill1",
|
||||
"watermill2",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"hoppersieve",
|
||||
"",
|
||||
}
|
||||
}
|
170
techage/doc/manual_ta1_EN.lua
Normal file
@ -0,0 +1,170 @@
|
||||
return {
|
||||
titles = {
|
||||
"1,TA1: Iron Age",
|
||||
"2,Charcoal Pile (charcoal burner)",
|
||||
"2,Melting Furnace",
|
||||
"2,Watermill",
|
||||
"3,TA1 mill",
|
||||
"3,TA1 sluice gate",
|
||||
"3,TA1 sluice handle",
|
||||
"3,TA1 Apple Wood Board",
|
||||
"3,TA1 Apple Millrace Board",
|
||||
"2,Ores and Tools",
|
||||
"3,Hammer",
|
||||
"3,Gravel Sieve",
|
||||
"3,Hopper",
|
||||
"3,Gravel seven with the hopper",
|
||||
"3,Meridium",
|
||||
},
|
||||
texts = {
|
||||
"TA1 is about mining sufficient ores and producing charcoal with simple tools and equipment\\, so that TA2 machines can be manufactured and operated.\n"..
|
||||
"\n"..
|
||||
"Of course\\, for an iron age there must also be iron and not just steel\\, as in \"Minetest Game\". As a result\\, some recipes have been changed so that iron has to be produced first and then steel later.\n"..
|
||||
"\n"..
|
||||
"The durability of the tools is based on the ages and therefore does not correspond to the original Minetest game.\n"..
|
||||
"The durability / hardness for an axe\\, for example:\n"..
|
||||
"\n"..
|
||||
" - Bronze: 20\n"..
|
||||
" - Steel: 30\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"You need the Charcoal Pile to make charcoal. Charcoal is required for the melting furnace\\, but also\\, for example\\, in TA2 for the steam engine.\n"..
|
||||
"\n"..
|
||||
"For the charcoal burner you need:\n"..
|
||||
"\n"..
|
||||
" - a lighter block ('techage:lighter')\n"..
|
||||
" - 26 wooden blocks that are stacked into a pile of wood. The type of wood is irrelevant\n"..
|
||||
" - Dirt to cover the pile of wood\n"..
|
||||
" - Flint and Iron (technical name: 'fire:flint_and_steel') to light the lighter block\n"..
|
||||
"\n"..
|
||||
"Building instructions (see also plan):\n"..
|
||||
"\n"..
|
||||
" - Build a 5x5 area of dirt\n"..
|
||||
" - Place 7 wood around the lighter but leave a hole to the lighter\n"..
|
||||
" - Build another 2 layers of wood on top\\, making a 3x3x3 wooden cube\n"..
|
||||
" - Cover everything with a layer of dirt into a 5x5x5 cube\\, but keep the hole to the lighter open\n"..
|
||||
" - Light the lighter and immediately close the hole with a block of wood and dirt\n"..
|
||||
" - If you have done everything correctly\\, the coal burner will start smoking after a few seconds\n"..
|
||||
" - Only open the charcoal burner when the smoke has disappeared (approx. 20 min)\n"..
|
||||
"\n"..
|
||||
"Then you can remove the 9 charcoal blocks and refill the Charcoal Pile.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"You need the melting furnace\\, for example\\, to melt iron and other ores in the melting pot. There are different recipes that require different temperatures. The higher the melting tower\\, the hotter the flame. A height of 11 blocks above the base plate is for all recipes\\, but a burner with this height also requires more charcoal.\n"..
|
||||
"\n"..
|
||||
"Building instructions (see also plan):\n"..
|
||||
"\n"..
|
||||
" - Build a stone tower (cobble) with a 3x3 base (7-11 blocks high)\n"..
|
||||
" - Leave a hole open on one side at the bottom\n"..
|
||||
" - Put a lighter in it\n"..
|
||||
" - Fill the tower to the brim with charcoal by dropping the charcoal into the hole from above\n"..
|
||||
" - Light the lighter through the hole\n"..
|
||||
" - Place the melting pot on top of the tower directly into the flame\\, one block above the tower edge\n"..
|
||||
" - To stop the burner\\, temporarily close the hole with an dirt block\\, for example.\n"..
|
||||
"\n"..
|
||||
"The melting pot has its own menu of recipes and an inventory where you have to put the ores in.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The watermill can be used to grind wheat and other grains into flour and then bake them in the furnace to make bread. \n"..
|
||||
"The mill is powered by water power. To do this\\, a millrace must be led to the mill wheel via a canal.\n"..
|
||||
"The water flow and thus the mill wheel can be controlled via a sluice. The sluice consists of the sluice lock and sluice handle.\n"..
|
||||
"\n"..
|
||||
"The picture on the right (click on \"Plan\") shows the structure of the watermill. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The watermill can be used to grind wheat and other grains into flour and then bake them in the oven to make bread. The mill must be connected to the mill wheel with a TA1 axle. The power of the mill wheel is only enough for one mill.\n"..
|
||||
"\n"..
|
||||
"The mill can be automated with the help of a Minecart Hopper\\, so that the flour\\, for example\\, is transported directly from the mill into an furnace in order to bake bread from it.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The sluice gate valve must be placed directly next to a pond or in a stream at the same height as the water surface.\n"..
|
||||
"When the gate is opened\\, water flows through the slide. This water then has to be fed to the mill wheel\\, where it drives the mill.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The TA1 sluice handle must be placed on the sluice gate. The gate can be opened with the aid of the sluice handle (right click).\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Block in different types of wood for building the millrace canal. However\\, any other material can also be used.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Block in different types of wood for building the millrace canal. This block is especially suitable in connection\n"..
|
||||
"with posts of the wooden fence to build a support of the canal.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"TA1 has its own tools such as hammer and gravel sieve\\, but the Minecart Hopper can also be used.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The TA1 hammer can be used to knock/dig stone in a mine\\, but also to smash cobble to gravel. The hammer is available in different versions and therefore different properties: bronze\\, steel\\, brass and diamond.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Ores can be sifted from the gravel with the gravel sieve. To do this\\, click on the sieve with the gravel. The sifted gravel and ores fall out below.\n"..
|
||||
"\n"..
|
||||
"In order not to stand at the sieve for hours\\, sieving can be automated with the hopper.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The hopper from the \"Minecart\" mod is primarily used for loading and unloading Minecarts. He sucks in items from above and passes them on to the right. Therefore\\, when placing the hopper\\, pay attention to the direction of dispensing.\n"..
|
||||
"\n"..
|
||||
"The hopper can also pull items from boxes (chest)\\, provided the box is next to or on the hopper.\n"..
|
||||
"\n"..
|
||||
"The hopper can also put items in boxes if the box is next to the hopper.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"With the help of two boxes\\, two hoppers and a gravel sieve\\, the sieving process can be automated. The plan on the right shows the structure.\n"..
|
||||
"\n"..
|
||||
"Make sure that the boxes are \"chest_locked\"\\, otherwise someone will steal the valuable ores from the box below.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"TA1 has its own metal alloy meridium. Meridium ingots can be made with the coal burner from steel and mesecons crystals. Meridium glows in the dark. Tools made of Meridium also light up and are therefore very helpful in underground mining.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
},
|
||||
images = {
|
||||
"techage_ta1",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta1_sluice",
|
||||
"ta1_sluice_handle",
|
||||
"ta1_board1",
|
||||
"ta1_board2",
|
||||
"ta1_gravelsieve",
|
||||
"hammer",
|
||||
"ta1_gravelsieve",
|
||||
"ta1_hopper",
|
||||
"",
|
||||
"meridium",
|
||||
},
|
||||
plans = {
|
||||
"",
|
||||
"coalpile",
|
||||
"coalburner",
|
||||
"watermill1",
|
||||
"watermill2",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"hoppersieve",
|
||||
"",
|
||||
}
|
||||
}
|
301
techage/doc/manual_ta2_DE.lua
Normal file
@ -0,0 +1,301 @@
|
||||
return {
|
||||
titles = {
|
||||
"1,TA2: Dampfzeitalter",
|
||||
"2,Dampfmaschine",
|
||||
"3,TA2 Feuerbox / Firebox",
|
||||
"3,TA2 Boiler",
|
||||
"3,TA2 Zylinder /Cylinder",
|
||||
"3,TA2 Schwungrad / Flywheel",
|
||||
"3,TA2 Dampfleitungen / Steam Pipe",
|
||||
"3,TA2 Antriebsachsen / TA2 Drive Axle",
|
||||
"3,TA2 Stromgenerator / TA2 Power Generator",
|
||||
"2,TA2 Energiespeicher",
|
||||
"3,TA2 Seilwinde / TA2 Winch",
|
||||
"3,TA2 Gewichtekiste / TA2 Weight Chest",
|
||||
"2,Items schieben und sortieren",
|
||||
"3,Röhren / TechAge Tube",
|
||||
"3,Röhren Konzentrator / Tube Concentrator",
|
||||
"3,TA2 Schieber / Pusher",
|
||||
"3,TA2 Verteiler / Distributor",
|
||||
"2,Kieswaschanlage",
|
||||
"3,TA2 Kiesspüler / Gravel Rinser",
|
||||
"2,Stein brechen\\, mahlen und sieben",
|
||||
"3,TA2 Steinbrecher / Quarry",
|
||||
"3,TA2 Mühle / Grinder",
|
||||
"3,TA2 Kiessieb / Gravel Sieve",
|
||||
"2,Items produzieren",
|
||||
"3,TA2 Autocrafter",
|
||||
"3,TA2 Elektronikfabrik / Electronic Fab",
|
||||
"2,Sonstige Blöcke",
|
||||
"3,TA2 Flüssigkeitensammler / Liquid Sampler",
|
||||
"3,TA2 Gesicherte Kiste / Protected Chest",
|
||||
"3,Techage Forceload Block",
|
||||
},
|
||||
texts = {
|
||||
"In TA2 geht es darum\\, erste Maschinen zur Verarbeitung von Erzen zu bauen und zu betreiben. Einige Maschinen müssen dazu über Antriebsachsen angetrieben werden. Dazu musst du eine Dampfmaschine bauen und diese mit Kohle oder Holzkohle anheizen.\n"..
|
||||
"\n"..
|
||||
"In TA2 steht auch ein Kiesspüler zur Verfügung\\, mit dem seltene Erze wie Usmium Nuggets ausgewaschen werden können. Diese Nuggets wirst du später für weitere Rezepte brauchen.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Dampfmaschine besteht aus mehreren Blöcken und muss wie im Plan rechts abgebildet\\, zusammen gebaut werden. Dazu werden die Blöcke TA2 Feuerbox\\, TA2 Boiler oben\\, TA2 Boiler unten\\, TA2 Zylinder\\, TA2 Schwungrad und Dampfleitungen benötigt.\n"..
|
||||
"\n"..
|
||||
"Zusätzlich werden Antriebsachsen sowie Getriebeblöcke für Richtungswechsel benötigt. Das Schwungrad muss über die Antriebsachsen mit allen Maschinen verbunden werden\\, die angetrieben werden müssen.\n"..
|
||||
"\n"..
|
||||
"Bei allen Blöcken beim Setzen immer auch die Ausrichtung achten:\n"..
|
||||
"\n"..
|
||||
" - Zylinder links\\, Schwungrad rechts daneben\n"..
|
||||
" - Dampfleitungen anschließen\\, wo ein entsprechendes Loch ist\n"..
|
||||
" - Antriebsachse beim Schwungrad nur rechts\n"..
|
||||
" - bei allen Maschinen kann die Antriebsachse an allen Seiten angeschlossen werden\\, welche nicht durch andere Funktionen belegt wird\\, wie bspw. die IN und OUT Löcher bei Mühle und Sieb.\n"..
|
||||
"\n"..
|
||||
"Der Boiler muss mit Wasser gefüllt werden. Dazu bis zu 10 Eimer Wasser in den Boiler füllen.\n"..
|
||||
"Die Feuerbox muss mit Kohle oder Holzkohle gefüllt werden.\n"..
|
||||
"Wenn das Wasser heiß ist (Temperaturanzeige ganz oben)\\, kann die Dampfmaschine am Schwungrad gestartet werden.\n"..
|
||||
"\n"..
|
||||
"Die Dampfmaschine leistet 25 ku und kann damit mehrere Maschinen gleichzeitig antreiben.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Teil der Dampfmaschine. \n"..
|
||||
"\n"..
|
||||
"Die Feuerbox muss mit Kohle oder Holzkohle gefüllt werden. Die Brenndauer ist abhängig von der Leistung\\, die von der Dampfmaschine angefordert wird. Unter Volllast brennt Kohle 32 s und Holzkohle 96 s.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Teil der Dampfmaschine. Muss mit Wasser gefüllt werden. Dies erfolgt durch Klicken mit einem Wassereimer auf den Boiler. Wenn kein Wasser mehr vorhanden ist oder die Temperatur zu weit absinkt\\, schaltet sich die Dampfmaschine ab. Bei der Dampfmaschine geht bei jedem Kolbenhub etwas Wasser als Dampf verloren\\, daher muss regelmäßig Wasser nachgefüllt werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Teil der Dampfmaschine.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Antriebsteil der Dampfmaschine. Das Schwungrad muss über Antriebsachsen mit den Maschinen verbunden werden. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Teil der Dampfmaschine. Der Boiler muss mit dem Zylinder über die Dampfleitungen (steam pipes) verbunden werden. Die Dampfleitung besitzt keine Abzweigungen\\, die maximale Länge beträgt 12 m (Blöcke).\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Antriebsachsen dienen zur Kraftübertragung von der Dampfmaschine zu anderen Maschinen. Die maximale Länge einer Antriebsachse beträgt 10 Blöcke. Über Getriebeboxen können auch größere Strecken überbrückt\\, sowie Abzweigungen und Richtungswechsel realisiert werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Um Lampen oder andere Stromverbraucher an einer Dampfmaschine betreiben zu können\\, wird der TA2 Stromgenerator benötigt. Der TA2 Stromgenerator muss auf einer Seite mit Antriebsachsen verbunden werden und liefert dann auf der anderen Seite elektrischen Strom.\n"..
|
||||
"\n"..
|
||||
"Wird der Stromgenerator nicht mit ausreichend Kraft versorgt\\, geht er in einen Fehlerzustand und muss über einen Rechtsklick wieder aktiviert werden.\n"..
|
||||
"\n"..
|
||||
"Das Stromgenerator nimmt primär max. 25 ku an Achsenkraft auf und gibt sekundär max. 24 ku als Strom wieder ab. Er verbraucht also ein ku für die Umwandlung.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Bei größeren Anlagen mit mehreren Dampfmaschinen oder vielen angetriebenen Maschinen empfiehlt sich ein Energiespeicher. Der Energiespeicher bei TA2 arbeitet mit Lageenergie. Dazu wird Balast (Steine\\, Kies) in einer Kiste mit Hilfe einer Seilwinde in die Höhe gezogen. Ist überschüssige Energie im Achsen-Netzwerk vorhanden\\, so wird die Kiste nach oben gezogen. Wird kurzfristig mehr Energie benötigt\\, als die Dampfmaschine liefern kann\\, so gibt der Energiespeicher die gespeicherte Energie wieder ab\\, und die Balast-Kiste bewegt sich wieder nach unten.\n"..
|
||||
"\n"..
|
||||
"Der Energiespeicher besteht aus mehreren Blöcken und muss wie im Plan rechts abgebildet\\, zusammen gebaut werden.\n"..
|
||||
"\n"..
|
||||
"Um die maximale Speicherkapazität zu erreichen\\, muss die Kiste mit Gewichten komplett gefüllt\\, und der Mast inklusive der zwei Getriebeboxen 12 Blöcke hoch sein. Kleinere Aufbauten sind aber auch möglich.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Seilwinde muss mit einer Getriebebox verbunden werden und kann so überschüssige Energie aufnehmen und damit eine Gewichtekiste nach oben ziehen. Die maximale Seillänge beträgt 10 Blöcke.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Diese Kiste muss mit bis zu 10 Blöcken Abstand unter die Seilwinde gesetzt und mit Pflastersteinen Kies oder Sand gefüllt werden. Ist das Mindestgewicht von einem Stack (99+ Items) erreicht und überschüssige Energie vorhanden\\, wird die Kiste automatisch über eine Seil mit der Seilwinde verbunden und in die Höhe gezogen.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Um Gegenstände (Items) von einer Verarbeitungsstation zur nächsten weiter zu transportieren\\, werden Schieber und Röhren verwendet. Siehe Plan.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Zwei Maschinen können mit Hilfe eines Schiebers und einer Röhre (tube) verbunden werden. Röhren besitzen keine Abzweigungen. Die maximale Länge beträgt 200 m (Blöcke).\n"..
|
||||
"\n"..
|
||||
"Röhren können alternativ mit Hilfe der Shift-Taste platziert werden. Dies erlaubt bspw. Röhren parallel zu verlegen\\, ohne dass diese sich unbeabsichtigt verbinden.\n"..
|
||||
"\n"..
|
||||
"Die Transportkapazität einer Röhre ist unbegrenzt und nur durch die Schieber begrenzt.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Über den Konzentrator können mehrere Röhren zu einer Röhre zusammengeführt werden. Die Richtung\\, in der alle Items weitergegeben werden\\, ist mit einem Pfeil markiert.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Ein Schieber ist in der Lage\\, Items aus Kisten oder Maschinen zu ziehen und in andere Kisten oder Maschinen zu schieben. Oder anders gesagt: Zwischen zwei Blöcken mit Inventar muss ein und genau ein Schieber sein. Mehrere Schieber in Reihe sind nicht möglich.\n"..
|
||||
"In die Gegenrichtung ist ein Schieber für Items aber durchlässig\\, so dass eine Kiste über eine Röhre gefüllt und ebenso geleert werden kann. \n"..
|
||||
"\n"..
|
||||
"Ein Schieber geht in den Zustand \"standby\"\\, wenn der keine Items zum Schieben hat. Ist der Ausgang blockiert oder das Inventory des Empfängers voll\\, so geht der Schieber in den Zustand \"blocked\". Aus beiden Zuständen kommt der Schieber nach einigen Sekunden selbsttätig wieder raus\\, sofern sich die Situation geändert hat.\n"..
|
||||
"\n"..
|
||||
"Der Verarbeitungsleistung eines TA2 Schiebers beträgt 2 Items alle 2 s.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Verteiler ist in der Lage\\, die Items aus seinem Inventar sortiert in bis zu vier Richtungen weiter zu transportieren. Dazu muss der Verteiler entsprechend konfiguriert werden. \n"..
|
||||
"\n"..
|
||||
"Der Verteiler besitzt dazu ein Menü mit 4 Filter mit unterschiedlichen Farben\\, entsprechend den 4 Ausgängen. Soll ein Ausgang genutzt werden\\, so muss der entsprechende Filter über die \"on\" Checkbox aktiviert werden. Alle Items\\, die für diesen Filter konfiguriert sind\\, werden über den zugeordneten Ausgang ausgegeben. Wird ein Filter aktiviert\\, ohne das Items konfiguriert werden\\, so sprechen wir hier von einem \"nicht-konfigurierten\"\\, offenen Ausgang.\n"..
|
||||
"\n"..
|
||||
"*Achtung: Der Verteiler ist an seinen Ausgängen gleichzeitig ein Schieber. Daher niemals die Gegenstände mit einem Schieber aus dem Verteiler ziehen!*\n"..
|
||||
"\n"..
|
||||
"Für einen nicht-konfigurierten Ausgang gibt es zwei Betriebsarten:\n"..
|
||||
"\n"..
|
||||
"1) Alle Items ausgeben\\, die an keine anderen Ausgängen ausgegeben werden können\\, auch wenn diese blockiert sind.\n"..
|
||||
"\n"..
|
||||
"2) Nur die Items ausgeben\\, die für keinen anderen Filter konfiguriert wurden.\n"..
|
||||
"\n"..
|
||||
"Im ersten Fall werden immer alle Items weitergeleitet und der Verteiler läuft nicht voll. Im zweiten Fall werden Items zurückgehalten und der Verteiler kann voll laufen und in der Folge blockieren.\n"..
|
||||
"\n"..
|
||||
"Einstellbar ist die Betriebsart über die \"blockiere\" Checkbox.\n"..
|
||||
"\n"..
|
||||
"Der Verarbeitungsleistung eines TA2 Verteilers beträgt 4 Items alle 2 s\\, wobei der Verteiler dabei versucht\\, die 4 Items auf die offenen Ausgänge zu verteilen.\n"..
|
||||
"\n"..
|
||||
"Wird dasselbe Item in einem Filter mehrfach hinterlegt\\, so beeinflusst dies das langfristige Verteilungsverhältnis entsprechend.\n"..
|
||||
"\n"..
|
||||
"Bitte beachte\\, dass die Verteilung ein probabilistischer Vorgang ist\\, d.h. die Verhältnisse werden nicht exakt\\, sondern nur langfristig eingehalten.\n"..
|
||||
"\n"..
|
||||
"In den Filtern beträgt die maximale Stackgröße 12\\; insgesamt können höchstens 36 Items konfiguriert werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Kieswaschanlage ist eine komplexere Maschine mit dem Ziel\\, Usmium Nuggets aus gesiebtem Kies auszuwaschen. Für den Aufbau wird ein TA2 Kiesspüler mit Achsenantrieb\\, ein Trichter\\, eine Kiste\\, sowie fließendes Wasser benötigt. \n"..
|
||||
"\n"..
|
||||
"Aufbau von links nach rechts (siehe auch Plan):\n"..
|
||||
"\n"..
|
||||
" - Ein Erdblock\\, darauf die Wasserquelle\\, umgeben auf 3 Seiten von bspw. Glasblöcken\n"..
|
||||
" - daneben den Kiesspüler\\, ggf. mit Röhrenanschlüssen für den Kies An- und Abtransport\n"..
|
||||
" - dann den Trichter mit Kiste\n"..
|
||||
"\n"..
|
||||
"Das Ganze umgeben von weiteren Glasblöcken\\, so dass das Wasser über den Kiesspüler und den Trichter fließt und ausgespülten Nuggets vom Trichter wieder eingesammelt werden können.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Kiesspüler ist in der Lage\\, aus bereits gesiebtem Kies die Erze Usmium und Kupfer auszuspülen\\, sofern dieser von Wasser überspült wird.\n"..
|
||||
"\n"..
|
||||
"Ob der Kiesspüler korrekt arbeitet\\, kann mit Hilfe von Stöcken (sticks) getestet werden\\, wenn diese in das Inventar des Kiesspülers getan werden. Diese müssen einzeln ausgespült und vom Trichter eingefangen werden.\n"..
|
||||
"\n"..
|
||||
"Die Verarbeitungsleistung ist ein Kies Item alle 2 s. Der Kiesspüler benötigt 3 ku Energie.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Das Brechen\\, Mahlen und Siebe von Gestein dient zur Gewinnung von Erzen. Gesiebtes Kies kann aber auch anderweitig genutzt werden. Steinbrecher\\, Mühle und Sieb müssen angetrieben und damit in der Nähe einer Dampfmaschine aufgebaut werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Steinbrecher dient zum Abbau von Steinen und anderen Materialien aus dem Untergrund. Der Steinbrecher gräbt ein 5x5 Blöcke großes Loch. Die Tiefe ist einstellbar.\n"..
|
||||
"Die Verarbeitungsleistung ist ein Block alle 4 s. Der Steinbrecher benötigt 10 ku Energie. Die maximale Tiefe beträgt 20 Meter. Für größere Tiefen siehe TA3/TA4.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Mühle ist in der Lage\\, verschiedenes Gestein\\, aber auch Holz und andere Items zu mahlen.\n"..
|
||||
"Die Verarbeitungsleistung ist ein Item alle 4 s. Die Mühle benötigt 4 ku Energie.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Das Kiessieb ist in der Lage\\, Kies zu sieben um Erze zu gewinnen. Als Ergebnis erhält man teilweise \"gesiebtes Kies\"\\, was nicht wieder gesiebt werden kann.\n"..
|
||||
"Die Verarbeitungsleistung ist ein Item alle 4 s. Das Kiessieb benötigt 3 ku Energie.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit TA2 Maschinen können nicht nur Erze gewonnen\\, sondern auch Gegenstände hergestellt werden.\n"..
|
||||
"\n",
|
||||
"Der Autocrafter dient zur automatischen Herstellung von Waren. Alles was der Spieler über das \"Crafting Grid\" herstellen kann\\, kann auch durch den Autocrafter erledigt werden. Dazu müssen im Menü des Autocrafters das Rezept eingegeben und die notwendigen Zutaten hinzugefügt werden.\n"..
|
||||
"\n"..
|
||||
"Zutaten und hergestellte Waren können über Röhren und Schieber in und aus dem Block transportiert werden.\n"..
|
||||
"\n"..
|
||||
"Die Verarbeitungsleistung ist ein Item alle 4 s. Der Autocrafter benötigt 4 ku Energie.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Elektronikfabrik ist eine Spezialmaschine und nur für die Herstellung der Vakuumröhren nutzbar. Vakuumröhren werden für TA3 Maschinen und Blöcke benötigt.\n"..
|
||||
"\n"..
|
||||
"Die Verarbeitungsleistung ist eine Vakuumröhre alle 6 s. Die Elektronikfabrik benötigt 8 ku Energie.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"",
|
||||
"Für manche Rezepte wird Wasser benötigt. Damit auch diese Rezepte automatisiert mit dem Autocrafter bearbeitet werden können\\, muss Wasser in Eimern bereitgestellt werden. Hierzu dient der Flüssigkeitensammler. Er benötigt leere Eimer und muss ins Wasser gestellt werden.\n"..
|
||||
"\n"..
|
||||
"Die Verarbeitungsleistung ist ein Wassereimer alle 8 s. Der Flüssigkeitensammler benötigt 3 ku Energie.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die gesicherte Kiste kann nur von den Spielern genutzt werden\\, die an diesem Ort auch bauen können\\, also Protection Rechte besitzen. Es spielt dabei keine Rolle\\, wer die Kiste setzt. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Minetest teilt die Karte in sogenannte Map-Blocks ein. Das sind Würfel mit 16x16x16 Blöcke Kantenlänge. So ein Map-Block wird vom Server immer komplett geladen\\, aber es werden nur die Blöcke um einen Spieler herum geladen (ca. 2-3 Blöcke in alle Richtungen). In Sichtrichtung des Spielers sind es auch mehr Map-Blöcke. Nur dieser Teil der Welt ist aktiv und nur hier wachsen Pflanzen und Bäume bzw. laufen die Maschinen.\n"..
|
||||
"\n"..
|
||||
"Mit einem Forceload-Block kannst du erzwingen\\, dass der Map-Block\\, in dem der Forceload Block steht\\, immer geladen bleibt\\, solange du auf dem Server bist. Wenn alle deine Farmen und Maschinen mit Forceload Blöcken abgedeckt sind\\, ist immer alles am Laufen.\n"..
|
||||
"\n"..
|
||||
"Die Map-Blöcke mit ihren Koordinaten sind vordefiniert\\, also bspw. (0\\,0\\,0) bis (15\\,15\\,15)\\, oder (16\\,16\\,16) bis (31\\,31\\,31).\n"..
|
||||
"Man kann einen Forceload-Block innerhalb eines Map-Blockes verschieben wie man will\\, die Position des Map-Blocks bleibt dabei unverändert. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
},
|
||||
images = {
|
||||
"techage_ta2",
|
||||
"",
|
||||
"ta2_firebox",
|
||||
"ta2_boiler",
|
||||
"ta2_cylinder",
|
||||
"ta2_flywheel",
|
||||
"ta2_steampipe",
|
||||
"ta2_driveaxle",
|
||||
"ta2_generator",
|
||||
"",
|
||||
"ta2_winch",
|
||||
"ta2_weight_chest",
|
||||
"",
|
||||
"tube",
|
||||
"concentrator",
|
||||
"ta2_pusher",
|
||||
"ta2_distributor",
|
||||
"",
|
||||
"ta2_rinser",
|
||||
"ta2_grinder",
|
||||
"ta2_quarry",
|
||||
"ta2_grinder",
|
||||
"ta2_gravelsieve",
|
||||
"",
|
||||
"ta2_autocrafter",
|
||||
"ta2_electronicfab",
|
||||
"",
|
||||
"ta2_liquidsampler",
|
||||
"ta2_chest",
|
||||
"ta2_forceload",
|
||||
},
|
||||
plans = {
|
||||
"",
|
||||
"steamengine",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta2_storage",
|
||||
"",
|
||||
"",
|
||||
"itemtransport",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"gravelrinser",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
}
|
||||
}
|
299
techage/doc/manual_ta2_EN.lua
Normal file
@ -0,0 +1,299 @@
|
||||
return {
|
||||
titles = {
|
||||
"1,TA2: Steam Age",
|
||||
"2,Steam Engine",
|
||||
"3,TA2 Firebox",
|
||||
"3,TA2 Boiler",
|
||||
"3,TA2 Cylinder",
|
||||
"3,TA2 Flywheel",
|
||||
"3,TA2 Steam Pipes",
|
||||
"3,TA2 Drive Axle / TA2 Gearbox",
|
||||
"3,TA2 Power Generator",
|
||||
"2,TA2 energy storage",
|
||||
"3,TA2 Winch",
|
||||
"3,TA2 Weight Chest",
|
||||
"2,Push and sort items",
|
||||
"3,TechAge Tube",
|
||||
"3,Tube Concentrator",
|
||||
"3,TA2 Pusher",
|
||||
"3,TA2 Distributor",
|
||||
"2,Gravel washer",
|
||||
"3,TA2 Gravel Rinser",
|
||||
"2,Dig stone\\, grind and sieve",
|
||||
"3,TA2 Quarry",
|
||||
"3,TA2 Grinder",
|
||||
"3,TA2 Gravel Sieve",
|
||||
"2,Produce Items",
|
||||
"3,TA2 Autocrafter",
|
||||
"3,TA2 Electronic Fab",
|
||||
"2,Other blocks",
|
||||
"3,TA2 Liquid Sampler",
|
||||
"3,TA2 Protected Chest",
|
||||
"3,Techage Forceload Block",
|
||||
},
|
||||
texts = {
|
||||
"TA2 is about building and operating the first machines for processing ores. Some machines have to be driven via drive axles. To do this\\, you need to build a steam engine and heat it with coal or charcoal.\n"..
|
||||
"\n"..
|
||||
"In TA2 there is also a gravel rinser that can be used to wash out rare ores such as Usmium nuggets. You will need these nuggets later for further recipes.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The steam engine consists of several blocks and must be assembled as shown in the plan on the right. The blocks TA2 fire box\\, TA2 boiler top\\, TA2 boiler bottom\\, TA2 cylinder\\, TA2 flywheel and steam pipes are required.\n"..
|
||||
"\n"..
|
||||
"In addition\\, drive axles and gear blocks are required for changing direction. The flywheel must be connected to all machines that have to be driven via the drive axles.\n"..
|
||||
"\n"..
|
||||
"Always pay attention to the alignment of all blocks when placing:\n"..
|
||||
"\n"..
|
||||
" - Cylinder on the left\\, flywheel on the right\n"..
|
||||
" - Connect steam pipes where there is a corresponding hole\n"..
|
||||
" - Drive axle on flywheel only on the right\n"..
|
||||
" - In all machines\\, the drive axles can be connected on all sides\\, which is not occupied by other functions\\, such as the IN and OUT holes in the grinder and sieve.\n"..
|
||||
"\n"..
|
||||
"The boiler must be filled with water. Fill up to 10 buckets of water in the boiler.\n"..
|
||||
"The fire box must be filled with coal or charcoal.\n"..
|
||||
"When the water is hot (temperature display at the top)\\, the steam engine can be started on the flywheel.\n"..
|
||||
"\n"..
|
||||
"The steam engine has a capacity of 25 ku\\, so it can drive several machines at the same time.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Part of the steam engine.\n"..
|
||||
"\n"..
|
||||
"The fire box must be filled with coal or charcoal. The burning time depends on the power demanded by the steam engine. Coal burns for 32 s and charcoal for 96 s under full load.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Part of the steam engine. Must be filled with water. This is done by clicking on the boiler with a water bucket. When there is no more water or the temperature drops too low\\, the steam engine switches off. With the steam engine\\, some water is lost as steam with each piston stroke\\, so water has to be refilled regularly.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Part of the steam engine.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Drive part of the steam engine. The flywheel must be connected to the machines via drive axles.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Part of the steam engine. The boiler must be connected to the cylinder via the steam pipes. The steam pipe has no branches\\, the maximum length is 12 m (blocks).\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The drive axles are used to transmit power from the steam engine to other machines. The maximum length of a drive axis is 10 blocks. With TA2 Gearboxes\\, larger distances can be bridged\\, and branches and changes of direction can be realized.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The TA2 Power Generator is required to operate lamps or other power consumers on a steam engine. The TA2 Power Generator has to be connected to drive axles on one side and then supplies electricity on the other side.\n"..
|
||||
"\n"..
|
||||
"If the Power Generator is not supplied with sufficient power\\, it goes into an error state and must be reactivated with a right-click.\n"..
|
||||
"\n"..
|
||||
"The Power Generator takes max. 25 ku of axle power and provides on the other side max. 24 ku as electricity. So he consumes one ku for the conversion.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"For larger systems with several steam engines or many driven machines\\, an energy storage system is recommended. The energy storage at TA2 works with position energy. For this purpose\\, ballast (stones\\, gravel\\, sand) is pulled up in a chest with the help of a cable winch. If there is excess energy in the axis network\\, the chest is pulled upwards. If more energy is required in the short term than the steam engine can supply\\, the energy store releases the stored energy again and the weight chest moves down again. \n"..
|
||||
"The energy storage consists of several blocks and must be assembled as shown in the plan on the right. \n"..
|
||||
"In order to achieve the maximum storage capacity\\, the chest must be completely filled with weights and the mast including the two gear boxes must be 12 blocks high. Smaller structures are also possible.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The cable winch must be connected to a gear box and can absorb excess energy and thus pull a weight chest upwards. The maximum rope length is 10 blocks. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"This chest must be placed under the winch with a distance of up to 10 blocks and filled with cobblestone\\, gravel or sand. If the minimum weight of a stack (99+ items) is reached and there is excess energy\\, the box is automatically connected to the winch via a rope and pulled up. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"In order to transport objects from one processing station to the next\\, pushers and tubes are used. See plan.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Two machines can be connected with the help of a pusher and a tube. Tubes have no branches. The maximum length is 200 m (blocks).\n"..
|
||||
"\n"..
|
||||
"Alternatively\\, tubes can be placed using the Shift key. This allows\\, for example\\, tubes to be laid in parallel without them accidentally connecting.\n"..
|
||||
"\n"..
|
||||
"The transport capacity of a tube is unlimited and only limited by the pusher.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Several tubes can be combined into one tube via the concentrator. The direction in which all items are passed on is marked with an arrow. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"A pusher is able to pull items out of boxes or machines and push them into other boxes or machines. In other words\\, there must be one and exactly one pusher between two blocks with inventory. Multiple pushers in a row are not possible.\n"..
|
||||
"In the opposite direction\\, however\\, a pusher is permeable for items\\, so that a box can be filled via a tube and also taught.\n"..
|
||||
"\n"..
|
||||
"A pusher goes into the \"standby\" state if it has no items to push. If the output is blocked or the recipient's inventory is full\\, the pusher goes into the \"blocked\" state. The pusher automatically comes out of both states after a few seconds if the situation has changed.\n"..
|
||||
"\n"..
|
||||
"The processing power of a TA2 pusher is 2 items every 2 s.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The distributor is able to transport the items from his inventory sorted in up to four directions. To do this\\, the distributor must be configured accordingly.\n"..
|
||||
"\n"..
|
||||
"The distributor has a menu with 4 filters with different colors\\, corresponding to the 4 outputs. If an output is to be used\\, the corresponding filter must be activated via the \"on\" checkbox. All items that are configured for this filter are output via the assigned output. If a filter is activated without items being configured\\, we are talking about an \"unconfigured\"\\, open output.\n"..
|
||||
"\n"..
|
||||
"*Attention: The distributor is also a pusher at its output sides. Therefore\\, never pull items out of the distributor with a pusher!*\n"..
|
||||
"\n"..
|
||||
"There are two operating modes for a non-configured output:\n"..
|
||||
"\n"..
|
||||
"1) Output all items that cannot be output to any other exit\\, even if they are blocked.\n"..
|
||||
"\n"..
|
||||
"2) Only output the items that have not been configured for any other filter.\n"..
|
||||
"\n"..
|
||||
"In the first case\\, all items are always forwarded and the distributor does not run full. In the second case\\, items are held back and the distributor can run full and then block.\n"..
|
||||
"\n"..
|
||||
"The operating mode can be set using the \"blocking mode\" checkbox.\n"..
|
||||
"\n"..
|
||||
"The processing power of a TA2 distributor is 4 items every 2 s\\, whereby the distributor tries to distribute the 4 items to the open outputs.\n"..
|
||||
"\n"..
|
||||
"If the same item is configured multiple times in one filter\\, the long term distribution ratio will be influenced accordingly.\n"..
|
||||
"\n"..
|
||||
"Please note that the distribution is a probabilistic process. This means that the distribution rations won't be matched exactly\\, but only in the long term.\n"..
|
||||
"\n"..
|
||||
"The maximum stack size in the filters is 12\\; in total\\, not more than 36 items can be configured.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The gravel washer is a more complex machine with the goal of washing Usmium nuggets out of sieved gravel. A TA2 rinser with axis drive\\, a hopper\\, a chest and running water are required for the installation.\n"..
|
||||
"\n"..
|
||||
"Structure from left to right (see also plan):\n"..
|
||||
"\n"..
|
||||
" - A dirt block\\, on top of it the water source\\, surrounded on 3 sides by e.g. glass blocks\n"..
|
||||
" - next to it the gravel rinser\\, if necessary with tube connections for the gravel delivery and removal\n"..
|
||||
" - then the hopper with chest\n"..
|
||||
"\n"..
|
||||
"The whole thing is surrounded by further glass blocks\\, so that the water flows over the gravel rinser and the hopper and rinsed-out nuggets can be collected again by the hopper.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The gravel washer is able to rinse out the Usmium and copper ores from gravel that has already been sieved\\, provided that this is flushed with water.\n"..
|
||||
"\n"..
|
||||
"Whether the Gravel Rinser works correctly can be tested with sticks if these are placed in the inventory of the Gravel Rinser. These must be rinsed out individually and caught by the hopper.\n"..
|
||||
"\n"..
|
||||
"The processing power is one gravel item every 2 s. The gravel washer needs 3 ku of energy.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Crushing\\, grinding and sieving of cobblestone is used to extract ores. Sieved gravel can also be used for other purposes. Quarry\\, grinder and sieve must be driven and thus installed near a steam engine.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The quarry is used to remove stones and other materials from the underground. The quarry digs a 5x5 block hole. The depth is adjustable.\n"..
|
||||
"The processing power is one block every 4 s. The quarry needs 10 ku of energy. The maximum depth is 20 meters. For greater depths see TA3 / TA4.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The grinder is able to grind various rocks\\, but also wood and other items.\n"..
|
||||
"The processing power is one item every 4 s. The grinder needs 4 ku of energy.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The gravel sieve is able to sieve gravel to extract ores. The result is partially \"sieved gravel\"\\, which cannot be sieved again.\n"..
|
||||
"The processing power is one item every 4 s. The gravel sieve requires 3 ku of energy.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"TA2 machines can not only extract ores\\, but also produce objects.\n"..
|
||||
"\n",
|
||||
"The autocrafter is used for the automatic production of goods. Everything that the player can produce via the \"Crafting Grid\" can also be done by the autocrafter. To do this\\, the recipe must be entered in the menu of the autocrafter and the necessary ingredients added.\n"..
|
||||
"\n"..
|
||||
"Ingredients and manufactured goods can be transported in and out of the block via tubes and pushers.\n"..
|
||||
"\n"..
|
||||
"The processing power is one item every 4 s. The autocrafter requires 4 ku of energy.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The electronic fab is a special machine and can only be used for the production of vacuum tubes. Vacuum tubes are required for TA3 machines and blocks.\n"..
|
||||
"\n"..
|
||||
"The processing power is one vacuum tube every 6 s. The electronic fab requires 8 ku of energy.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"",
|
||||
"Some recipes require water. So that these recipes can also be processed automatically with the autocrafter\\, water must be provided in buckets. The liquid sampler is used for this. He needs empty buckets and has to be put in the water.\n"..
|
||||
"\n"..
|
||||
"The processing capacity is one water bucket every 8 s. The liquid sampler requires 3 ku of energy.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The protected chest can only be used by players who can build at this location\\, i.e. who have protection rights. It does not matter who sets the chest.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Minetest divides the map into so-called map blocks. These are cubes with an edge length of 16x16x16 blocks. Such a map block is always loaded completely by the server\\, but only the blocks around a player are loaded (approx. 2-3 blocks in all directions). In the player's direction of view\\, there are also more map blocks. Only this part of the world is active and only here do plants and trees grow or the machines run.\n"..
|
||||
"\n"..
|
||||
"With a forceload block you can force the map block in which the forceload block is located to remain loaded as long as you are on the server. When all your farms and machines are covered with Forceload blocks\\, everything is always running.\n"..
|
||||
"\n"..
|
||||
"The map blocks with their coordinates are predefined\\, e.g. (0\\,0\\,0) to (15\\,15\\,15)\\, or (16\\,16\\,16) to (31\\,31\\,31).\n"..
|
||||
"You can move a forceload block within a map block as you like\\, the position of the map block remains unchanged.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
},
|
||||
images = {
|
||||
"techage_ta2",
|
||||
"",
|
||||
"ta2_firebox",
|
||||
"ta2_boiler",
|
||||
"ta2_cylinder",
|
||||
"ta2_flywheel",
|
||||
"ta2_steampipe",
|
||||
"ta2_driveaxle",
|
||||
"ta2_generator",
|
||||
"",
|
||||
"ta2_winch",
|
||||
"ta2_weight_chest",
|
||||
"",
|
||||
"tube",
|
||||
"concentrator",
|
||||
"ta2_pusher",
|
||||
"ta2_distributor",
|
||||
"",
|
||||
"ta2_rinser",
|
||||
"ta2_grinder",
|
||||
"ta2_quarry",
|
||||
"ta2_grinder",
|
||||
"ta2_gravelsieve",
|
||||
"",
|
||||
"ta2_autocrafter",
|
||||
"ta2_electronicfab",
|
||||
"",
|
||||
"ta2_liquidsampler",
|
||||
"ta2_chest",
|
||||
"ta2_forceload",
|
||||
},
|
||||
plans = {
|
||||
"",
|
||||
"steamengine",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta2_storage",
|
||||
"",
|
||||
"",
|
||||
"itemtransport",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"gravelrinser",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
}
|
||||
}
|
919
techage/doc/manual_ta3_DE.lua
Normal file
@ -0,0 +1,919 @@
|
||||
return {
|
||||
titles = {
|
||||
"1,TA3: Ölzeitalter",
|
||||
"2,Kohlekraftwerk / Ölkraftwerk",
|
||||
"3,TA3 Kraftwerks-Feuerbox / Power Station Firebox",
|
||||
"3,TA3 Kraftwerks-Ölbrenner / TA3 Power Station Oil Burner",
|
||||
"3,TA3 Boiler unten/oben",
|
||||
"3,TA3 Turbine",
|
||||
"3,TA3 Generator",
|
||||
"3,TA3 Kühler / Cooler",
|
||||
"2,Elektrischer Strom",
|
||||
"3,Bedeutung von Speichersystemen",
|
||||
"3,TA Stromkabel / Electric Cable",
|
||||
"3,TA Verteilerdose / Electric Junction Box",
|
||||
"3,TA Stromleitung / Power Line",
|
||||
"3,TA Strommast / Power Pole",
|
||||
"3,TA Strommastkopf / Power Pole Top",
|
||||
"3,TA Strommastkopf 2 / Power Pole Top 2",
|
||||
"3,TA Stromschalter / Power Switch",
|
||||
"3,TA Stromschalter klein / Power Switch Small",
|
||||
"3,TA Stromschalterbox / Power Switch Box",
|
||||
"3,TA3 Kleiner Stromgenerator / Tiny Power Generator",
|
||||
"3,TA3 Akku Block / Akku Box",
|
||||
"3,TA3 Strom Terminal / Power Terminal",
|
||||
"3,TA3 Elektromotor / TA3 Electric Motor",
|
||||
"2,TA3 Industrieofen",
|
||||
"3,TA3 Ofen-Ölbrenner / Furnace Oil Burner",
|
||||
"3,TA3 Ofenoberteil / Furnace Top",
|
||||
"3,TA3 Gebläse / Booster",
|
||||
"2,Flüssigkeiten",
|
||||
"3,TA3 Tank / TA3 Tank",
|
||||
"3,TA3 Pumpe / TA3 Pump",
|
||||
"3,TA Einfülltrichter / TA Liquid Filler",
|
||||
"3,TA4 Röhre / Pipe",
|
||||
"3,TA3 Rohr/Wanddurchbruch / TA3 Pipe Wall Entry Blöcke",
|
||||
"3,TA Ventil / TA Valve",
|
||||
"2,Öl-Förderung",
|
||||
"3,TA3 Ölexplorer / Oil Explorer",
|
||||
"3,TA3 Ölbohrkiste / Oil Drill Box",
|
||||
"3,TA3 Ölpumpe / Oil Pumpjack",
|
||||
"3,TA3 Bohrgestänge / Drill Pipe",
|
||||
"3,Öltank / Oil Tank",
|
||||
"2,Öl-Transport",
|
||||
"3,Öl-Transport mit dem Tankwagen",
|
||||
"3,Öl-Transport mit Fässern über Minecarts",
|
||||
"3,Tankwagen / Tank Cart",
|
||||
"3,Kistenwagen / Chest Cart",
|
||||
"2,Öl-Verarbeitung",
|
||||
"3,Destillationsturm / distiller tower",
|
||||
"4,Aufkocher / reboiler)",
|
||||
"2,Logik-/Schalt-Blöcke",
|
||||
"3,TA3 Taster/Schalter / Button/Switch",
|
||||
"3,TA3 Kommando Konverter / Command Converter",
|
||||
"3,TA3 Flipflop / Flip-Flop",
|
||||
"3,TA3 Logikblock / Logic Block",
|
||||
"3,TA3 Wiederholer / Repeater",
|
||||
"3,TA3 Sequenzer / Sequencer",
|
||||
"3,TA3 Timer",
|
||||
"3,TA3 Terminal",
|
||||
"3,TechAge Farblampe / Color Lamp",
|
||||
"3,Tür/Tor Blöcke / Door/Gate Blocks",
|
||||
"3,TA3 Tür Controller / Door Controller",
|
||||
"3,TA3 Tür Controller II / Door Controller II",
|
||||
"3,TA3 Sound Block",
|
||||
"3,TA3 Mesecons Umsetzer / TA3 Mesecons Converter",
|
||||
"2,Detektoren",
|
||||
"3,TA3 Detektor / Detector",
|
||||
"3,TA3 Wagen Detektor / Cart Detector",
|
||||
"3,TA3 Block Detektor / Node Detector",
|
||||
"3,TA3 Spieler Detektor / Player Detector",
|
||||
"3,TA3 Lichtdetektor",
|
||||
"2,TA3 Maschinen",
|
||||
"3,TA3 Schieber / Pusher",
|
||||
"3,TA3 Verteiler / Distributor",
|
||||
"3,TA3 Autocrafter",
|
||||
"3,TA3 Elektronikfabrik / Electronic Fab",
|
||||
"3,TA3 Steinbrecher / Quarry",
|
||||
"3,TA3 Kiessieb / Gravel Sieve",
|
||||
"3,TA3 Kieswaschanlage / Gravel Rinser",
|
||||
"3,TA3 Mühle / Grinder",
|
||||
"3,TA3 Injektor / Injector",
|
||||
"2,Werkzeuge",
|
||||
"3,Techage Info Tool",
|
||||
"3,TechAge Programmer",
|
||||
"3,TechAge Kelle / Trowel",
|
||||
"3,TA3 Bohrgestängezange / TA3 Drill Pipe Wrench",
|
||||
"3,Techage Schraubendreher",
|
||||
},
|
||||
texts = {
|
||||
"Bei TA3 gilt es\\, die Dampf-betriebenen Maschinen durch leistungsfähigere und mit elektrischem Strom betriebene Maschinen abzulösen.\n"..
|
||||
"\n"..
|
||||
"Dazu musst du Kohlekraftwerke und Generatoren bauen. Bald wirst du sehen\\, dass dein Strombedarf nur mit Öl-betriebenen Kraftwerken zu decken ist. Also machst du dich auf die Suche nach Erdöl. Bohrtürme und Ölpumpen helfen die\\, an das Öl zu kommen. Schienenwege dienen dir zum Öltransport bis in die Kraftwerke.\n"..
|
||||
"\n"..
|
||||
"Das Industrielle Zeitalter ist auf seinem Höhepunkt.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Das Kohlekraftwerk besteht aus mehreren Blöcken und muss wie im Plan rechts abgebildet\\, zusammen gebaut werden. Dazu werden die Blöcke TA3 Kraftwerks-Feuerbox\\, TA3 Boiler oben\\, TA3 Boiler unten\\, TA3 Turbine\\, TA3 Generator und TA3 Kühler benötigt.\n"..
|
||||
"\n"..
|
||||
"Der Boiler muss mit Wasser gefüllt werden. Dazu bis zu 10 Eimer Wasser in den Boiler füllen.\n"..
|
||||
"Die Feuerbox muss mit Kohle oder Holzkohle gefüllt werden.\n"..
|
||||
"Wenn das Wasser heiß ist\\, kann der Generator gestartet werden.\n"..
|
||||
"\n"..
|
||||
"Das Kraftwerk kann alternativ auch mit einem Ölbrenner ausgestattet und dann mit Öl betrieben werden.\n"..
|
||||
"Das Öl kann über eine Pumpe und Ölleitung nachgefüllt werden.\n"..
|
||||
"\n"..
|
||||
"Das Kraftwerk liefert eine Leistung von 80 ku.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Teil des Kraftwerks. \n"..
|
||||
"Die Feuerbox muss mit Kohle oder Holzkohle gefüllt werden. Die Brenndauer ist abhängig von der Leistung\\, die vom Kraftwerk angefordert wird. Unter Volllast brennt Kohle 20 s und Holzkohle 60 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit).\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Teil des Kraftwerks. \n"..
|
||||
"\n"..
|
||||
"Der Ölbrenner kann mit Erdöl\\, Schweröl\\, Naphtha oder Benzin gefüllt werden. Die Brenndauer ist abhängig von der Leistung\\, die vom Kraftwerk angefordert wird. Unter Volllast brennt Erdöl 15 s\\, Schweröl 20 s\\, Naphtha 22 s und Benzin 25 s. \n"..
|
||||
"\n"..
|
||||
"Unter Teillast entsprechend länger (50% Last = doppelte Zeit).\n"..
|
||||
"\n"..
|
||||
"Der Ölbrenner kann nur 50 Einheiten Kraftstoff aufnehmen. Ein zusätzlicher Öltank und eine Ölpumpe sind daher ratsam.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Teil des Kraftwerk. Muss mit Wasser gefüllt werden. Wem kein Wasser mehr vorhanden ist oder die Temperatur zu weit absinkt\\, schaltet sich das Kraftwerk ab. Der Wasserverbrauch des TA3-Kessels ist durch den geschlossenen Dampfkreislauf viel geringer als bei der Dampfmachine.\n"..
|
||||
"Bei der Dampfmaschine geht bei jedem Kolbenhub etwas Wasser als Dampf verloren.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Turbine ist Teil des Kraftwerk. Sie muss neben den Generator gesetzt und über Dampfleitungen mit dem Boiler und dem Kühler\\, wie im Plan abgebildet\\, verbunden werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Generator dient zur Stromerzeugung. Er muss über Stromkabel und Verteilerdosen mit den Maschinen verbunden werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Dient zur Abkühlung des heißen Dampfs aus der Turbine. Muss über Dampfleitungen mit dem Boiler und der Turbine\\, wie im Plan abgebildet\\, verbunden werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"In TA3 (und TA4) werden die Maschinen mit Strom angetrieben. Dazu müssen die Maschinen\\, Speichersysteme und Generatoren mit Stromkabel verbunden werden.\n"..
|
||||
"TA3 besitzt 2 Arten von Stromkabel:\n"..
|
||||
"\n"..
|
||||
" - Isolierte Kabel (TA Stromkabel) für die lokale Verkabelung im Boden oder in Gebäuden. Diese Kabel lassen sich in der Wand oder im Boden verstecken (können mit der Kelle \"verputzt\" werden).\n"..
|
||||
" - Überlandleitungen (TA Stromleitung) für Freiluftverkabelung über große Strecken. Diese Kabel sind geschützt\\, können also von anderen Spielern nicht entfernt werden.\n"..
|
||||
"\n"..
|
||||
"Mehrere Verbraucher\\, Speichersysteme und Generatoren können in einem Stromnetzwerk zusammen betrieben werden. Mit Hilfe der Verteilerdosen können so Netzwerke aufgebaut werden.\n"..
|
||||
"Wird zu wenig Strom bereitgestellt\\, gehen die Verbraucher aus.\n"..
|
||||
"In diesem Zusammenhang ist auch wichtig\\, dass die Funktionsweise von Forceload Blöcken verstanden wurde\\, denn bspw. Generatoren liefern nur Strom\\, wenn der entsprechende Map-Block geladen ist. Dies kann mit einen Forceload Block erzwungen werden.\n"..
|
||||
"\n"..
|
||||
"In TA4 kommt noch ein Kabel für die Solaranlage hinzu.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Speichersysteme im Stromnetz erfüllen zwei Aufgaben:\n"..
|
||||
"\n"..
|
||||
" - Um Bedarfsspitzen abzufangen: Alle Generatoren liefern immer gerade soviel Leistung\\, wie benötigt wird. Werden aber Verbraucher ein/ausgeschaltet oder kommt es aus anderen Gründen zu Bedarfsschwankungen\\, so können Verbraucher kurzzeitig ausfallen. Um dies zu verhindern\\, sollte immer mindestens ein Akkublock in jedem Netzwerk vorhanden sein. Dieser dient als Puffer und gleicht diese Schwankungen im Sekundenbereich aus.\n"..
|
||||
" - Um regenerative Energie zu speichern: Solar und Wind stehen nicht 24 Stunden am Tag zur Verfügung. Damit die Stromversorgung nicht ausfällt\\, wenn kein Strom produziert wird\\, müssen ein oder mehrere Speichersysteme im Netzwerk verbaut werden. Alternativ können die Lücken auch mit Öl/Kohle-Strom überbrückt werden.\n"..
|
||||
"\n"..
|
||||
"Ein Speichersystem gibt seine Kapazität in kud an\\, also ku pro day (Tag). Bspw. ein Speichersystem mit 100 kud liefert 100 ku einen Spieltag lang\\, oder auch 10 ku für 10 Spieltage.\n"..
|
||||
"\n"..
|
||||
"Alle TA3/TA4 Energiequellen besitzen eine einstellbare Ladecharakteristik. Standardmäßig ist diese auf \"80% - 100%\" eingestellt. Dies bedeutet\\, dass die Leistung ab 80% Füllung des Speichersystems immer weiter reduziert wird\\, bis sie bei 100 % komplett abschaltet. Sofern Strom im Netzwerk benötigt wird\\, werden die 100 % nie erreicht\\, da die Leistung des Generators irgendwann auf den Strombedarf im Netzwerk abgesunken ist und damit das Speichersystem nicht mehr geladen\\, sondern nur noch die Verbraucher bedient werden.\n"..
|
||||
"\n"..
|
||||
"Dies hat mehrere Vorteile:\n"..
|
||||
"\n"..
|
||||
" - Die Ladecharakteristik ist einstellbar. Damit kann man bspw. Öl/Kohle Energiequellen bei 60% und die regenerativen Energiequellen erst bei 80% zurückfahren. Damit wird nur Öl/Kohle verbrannt\\, wenn nicht ausreichend regenerativen Energiequellen zur Verfügung stehen.\n"..
|
||||
" - Mehrere Energiequellen können parallel betrieben werden und werden dabei nahezu gleichmäßig belastet\\, denn alle Energiequellen arbeiten bspw. bis 80% Ladekapazität des Speichersystems mit ihrer vollen Leistung und fahren dann gleichzeitig ihre Leistung zurück.\n"..
|
||||
" - Alle Speichersysteme in einem Netzwerk bilden einen großen Puffer. An jedem Speichersystem aber auch am Strom Terminal kann immer die Ladekapazität und der Füllungsgrad des gesamten Speichersystems in Prozent abgelesen werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Für die lokale Verkabelung im Boden oder in Gebäuden.\n"..
|
||||
"Abzweigungen können mit Hilfe von Verteilerdosen realisiert werden. Die maximale Kabellänge zwischen Maschinen oder Verteilerdosen beträgt 1000 m. Es können maximale 1000 Knoten in einem Strom-Netzwerk verbunden werden. Als Knoten zählen alle Blöcke mit Stromanschluss\\, also auch Verteilerdosen.\n"..
|
||||
"\n"..
|
||||
"Da die Stromkabel nicht automatisch geschützt sind\\, wird für längere Strecken die Überlandleitungen (TA Stromleitung) empfohlen.\n"..
|
||||
"\n"..
|
||||
"Stromkabel können mit der Kelle verputzt also in der Wand oder im Boden versteckt werden. Als Material zum Verputzen können alle Stein-\\, Clay- und sonstige Blöcke ohne \"Intelligenz\" genutzt werden. Erde (dirt) geht nicht\\, da Erde zu Gras oder ähnlichem konvertiert werden kann\\, was die Leitung zerstören würde.\n"..
|
||||
"\n"..
|
||||
"Zum Verputzen muss mit der Kelle auf das Kabel geklickt werden. Das Material\\, mit dem das Kabel verputzt werden soll\\, muss sich im Spieler-Inventar ganz links befinden.\n"..
|
||||
"Die Kabel können wieder sichtbar gemacht werden\\, indem man mit der Kelle wieder auf den Block klickt.\n"..
|
||||
"\n"..
|
||||
"Außer Kabel können auch die TA Verteilerdose und die TA Stromschalterbox verputzt werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit der Verteilerdose kann Strom in bis zu 6 Richtungen verteilt werden. Verteilerdosen können auch mit der Kelle verputzt (versteckt) und wieder sichtbar gemacht werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit der TA Stromleitung und den Strommasten können halbwegs realistische Überlandleitungen realisiert werden. Die Strommasten-Köpfe dienen gleichzeitig zum Schutz der Stromleitung (Protection). Dazu muss alle 16 m oder weniger ein Masten gesetzt werden. Der Schutz gilt aber nur die die Stromleitung und die Masten\\, alle anderen Blöcke in diesem Bereich sind dadurch nicht geschützt.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Dient zum Bauen von Strommasten. Ist durch den Strommast-Kopf vor Zerstörung geschützt und kann nur vom Besitzer wieder abgebaut werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Hat bis zu vier Arme und erlaubt damit\\, Strom in bis zu 6 Richtungen weiter zu verteilen. \n"..
|
||||
"Der Strommastkopf schützt Stromleitungen und Masten in einem Radius von 8 m.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Dieser Strommastkopf hat zwei feste Arme und wird für die Überlandleitungen genutzt. Er kann aber auch Strom nach unten und oben weiterleiten.\n"..
|
||||
"Der Strommastkopf schützt Stromleitungen und Masten in einem Radius von 8 m.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit dem Schalter kann der Strom ein- und ausgeschaltet werden. Der Schalter muss dazu auf eine Stromschalterbox gesetzt werden. Die Stromschalterbox muss dazu auf beiden Seiten mit dem Stromkabel verbunden sein.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit dem Schalter kann der Strom ein- und ausgeschaltet werden. Der Schalter muss dazu auf eine Stromschalterbox gesetzt werden. Die Stromschalterbox muss dazu auf beiden Seiten mit dem Stromkabel verbunden sein.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"siehe TA Stromschalter.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der kleine Stromgenerator wird mit Benzin betrieben und kann für kleine Verbraucher mit bis zu 12 ku genutzt werden. Unter Volllast brennt Benzin 150 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit).\n"..
|
||||
"\n"..
|
||||
"Der Stromgenerator kann nur 50 Einheiten Benzin aufnehmen. Ein zusätzlicher Tank und eine Pumpe sind daher ratsam.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Akku Block dient zur Speicherung von überschüssiger Energie und gibt bei Stromausfall automatisch Strom ab (soweit vorhanden).\n"..
|
||||
"Mehrere Akku Blocks zusammen bilden ein TA3 Energiespeichersystem. Jeder Akku Block hat eine Anzeige für den Ladezustand und für die gespeicherte Ladung\\, wobei hier immer die Werte für das gesamte Netzwerk angezeigt werden. Die gespeicherte Ladung wird in \"kud\" also \"ku-days\" angezeigt (analog zu kWh) 5 kud entspricht damit bspw. 5 ku für einen Spieltag (20 min) oder 1 ku für 5 Spieltage.\n"..
|
||||
"\n"..
|
||||
"Ein Akku Block hat 3.33 kud.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Das Strom-Terminal muss mit dem Stromnetz verbunden werden. Es zeigt Daten aus dem Stromnetz an.\n"..
|
||||
"\n"..
|
||||
"In der oberen Hälfte werden die wichtigsten Größen ausgegeben:\n"..
|
||||
"\n"..
|
||||
" - aktuelle/maximale Generatorleistung\n"..
|
||||
" - aktueller Stromaufnahme aller Verbraucher\n"..
|
||||
" - aktueller Ladestrom in/aus dem Speichersystems\n"..
|
||||
" - aktuellen Ladezustand des Speichersystems in Prozent\n"..
|
||||
"\n"..
|
||||
"In der unteren Hälfte wird die Anzahl der Netzwerkblöcke ausgegeben.\n"..
|
||||
"\n"..
|
||||
"Über den Reiter \"console\" können weitere Daten zu den Generatoren und Speichersystemen abgefragt werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Um TA2 Maschinen über das Stromnetz betreiben zu können\\, wird der TA3 Elektromotor benötigt. Dieser wandelt Strom in Achsenkraft um.\n"..
|
||||
"Wird der Elektromotor nicht mit ausreichend Strom versorgt\\, geht er in einen Fehlerzustand und muss über einen Rechtsklick wieder aktiviert werden.\n"..
|
||||
"\n"..
|
||||
"Das Elektromotor nimmt primär max. 40 ku an Strom auf und gibt sekundär max. 39 ku als Achsenkraft wieder ab. Er verbraucht also ein ku für die Umwandlung.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der TA3 Industrieofen dient als Ergänzung zu normalen Ofen (furnace). Damit können alle Waren mit \"Koch\" Rezepten\\, auch im Industrieofen hergestellt werden. Es gibt aber auch spezielle Rezepte\\, die nur im Industrieofen hergestellt werden können.\n"..
|
||||
"Der Industrieofen hat sein eigenes Menü zur Rezeptauswahl. Abhängig von den Waren im Industrieofen Inventar links kann rechts das Ausgangsprodukt gewählt werden.\n"..
|
||||
"\n"..
|
||||
"Der Industrieofen benötigt Strom (für das Gebläse) sowie Schweröl/Benzin für den Brenner. Der Industrieofen muss wie im Plan rechts abgebildet\\, zusammen gebaut werden.\n"..
|
||||
"\n"..
|
||||
"Siehe auch TA4 Ofenheizung.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Ist Teil des TA3 Industrieofen.\n"..
|
||||
"\n"..
|
||||
"Der Ölbrenner kann mit Erdöl\\, Schweröl\\, Naphtha oder Benzin betrieben werden. Die Brennzeit beträgt für Erdöl 65 s\\, Schweröl 80 s\\, Naphtha 90 s und Benzin 100 s.\n"..
|
||||
"\n"..
|
||||
"Der Ölbrenner kann nur 50 Einheiten Kraftstoff aufnehmen. Ein zusätzlicher Tank und eine Pumpe sind daher ratsam.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Ist Teil des TA3 Industrieofen. Siehe TA3 Industrieofen.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Ist Teil des TA3 Industrieofen. Siehe TA3 Industrieofen.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Flüssigkeiten wie Wasser oder Öl können nur die spezielle Leitungen gepumpt und in Tanks gespeichert werden. Wie auch bei Wasser gibt es aber Behälter (Kanister\\, Fässer)\\, in denen die Flüssig gelagert und transportiert werden kann.\n"..
|
||||
"\n"..
|
||||
"Über die gelben Leitungen und Verbindungsstücke ist es auch möglich\\, mehrere Tanks zu verbinden. Allerdings müssen die Tanks den selben Inhalt haben und zwischen Tank\\, Pumpe und Verteiler muss immer mindestens eine gelbe Leitung sein.\n"..
|
||||
"\n"..
|
||||
"Bspw. zwei Tanks direkt mit einem Verteilerstück zu verbinden\\, geht nicht.\n"..
|
||||
"\n"..
|
||||
"Um Flüssigkeiten von Behältern nach Tanks umzufüllen\\, dient der Einfülltrichter. Im Plan ist dargestellt\\, wie Kanistern oder Fässer mit Flüssigkeiten über Schieber in einen Einfülltrichter geschoben werden. Im Einfülltrichter wird der Behälter geleert und die Flüssigkeit nach unten in den Tank geleitet. \n"..
|
||||
"\n"..
|
||||
"Der Einfülltrichter kann auch unter einen Tank gesetzt werden\\, um den Tank zu leeren.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"In einem Tank können Flüssigkeiten gespeichert werden. Ein Tank kann über eine Pumpe gefüllt bzw. geleert werden. Dazu muss die Pumpe über einer Leitung (gelbe Röhre) mit dem Tank verbunden sein.\n"..
|
||||
"\n"..
|
||||
"Ein Tank kann auch von Hand gefüllt oder geleert werden\\, indem mit einem vollen oder leeren Flüssigkeitsbehälter (Fass\\, Kanister) auf den Tank geklickt wird. Dabei ist zu beachten\\, dass Fässer nur komplett gefüllt oder entleert werden können. Sind bspw. weniger als 10 Einheiten im Tank\\, muss dieser Rest mit Kanistern entnommen oder leergepumpt werden.\n"..
|
||||
"\n"..
|
||||
"In einen TA3 Tank passen 1000 Einheiten oder 100 Fässer einer Flüssigkeit.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit der Pumpe können Flüssigkeiten von Tanks oder Behältern zu anderen Tanks oder Behältern gepumpt werden. Bei der Pumpe muss die Pumprichtung (Pfeil) beachtet werden. Über die gelben Leitungen und Verbindungsstücke ist es auch möglich\\, mehrere Tanks auf jeder Seite der Pumpe anzuordnen. Allerdings müssen die Tanks den selben Inhalt haben.\n"..
|
||||
"\n"..
|
||||
"Die TA3 Pumpe pumpt 4 Einheiten Flüssigkeit alle zwei Sekunden.\n"..
|
||||
"\n"..
|
||||
"Hinweis 1: Die Pumpe darf nicht direkt neben den Tank platziert werden. Es muss immer mindestens ein Stück gelbe Leitung dazwischen sein.\n"..
|
||||
"\n"..
|
||||
"Hinweis 2: Nach dem Starten markiert die Pumpe 10 x die Blöcke\\, von und zu denen gepumpt wird.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Um Flüssigkeiten zwischen Behältern und Tanks umzufüllen\\, dient der Einfülltrichter.\n"..
|
||||
"\n"..
|
||||
" - wird der Einfülltrichter unter einen Tank gesetzt und werden leere Fässer mit einem Schieber oder von Hand in den Einfülltrichter gegeben\\, wird der Tankinhalt in die Fässer umgefüllt und die Fässer können ausgangsseitig wieder entnommen werden\n"..
|
||||
" - wird der Einfülltrichter auf einen Tank gesetzt und werden volle Fässer mit einem Schieber oder von Hand in den Einfülltrichter gegeben\\, werden diese in den Tank umgefüllt und die Fässer können ausgangsseitig wieder entnommen werden\n"..
|
||||
"\n"..
|
||||
"Dabei ist zu beachten\\, dass Fässer nur komplett gefüllt oder entleert werden können. Sind bspw. weniger als 10 Einheiten im Tank\\, muss dieser Rest mit Kanistern entnommen oder leergepumpt werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die gelben Röhren dienen zur Weiterleitung von Gas und Flüssigkeiten. \n"..
|
||||
"Die maximale Leitungslänge beträgt 100 m.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Blöcke dienen als Wanddurchbrüche für Röhren\\, so dass keine Löcher offen bleiben.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Für die gelben Röhren gibt es ein Ventil\\, welches über Mausklicks geöffnet und geschlossen werden kann.\n"..
|
||||
"Das Ventil kann auch über on/off Kommandos angesteuert werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Um deine Generatoren und Öfen mit Öl betreiben zu können\\, muss du zuerst nach Öl suchen und einen Bohrturm errichten und danach das Öl fördern.\n"..
|
||||
"Dazu dienen dir TA3 Ölexplorer\\, TA3 Ölbohrkiste und TA3 Ölpumpe.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit dem Ölexplorer kannst du nach Öl suchen. Dazu den Block auf den Boden setzen und mit Rechtsklick die Suche starten. Der Ölexplorer kann oberirdisch und unterirdisch in allen Tiefen eingesetzt werden.\n"..
|
||||
"Über die Chat-Ausgabe wird dir angezeigt\\, in welcher Tiefe nach Öl gesucht wurde und wie viel Öl (oil) gefunden wurde.\n"..
|
||||
"Du kannst mehrfach auf den Block klicken\\, um auch in tieferen Bereichen nach Öl zu suchen. Ölfelder haben eine Größe von 4000 bis zu 20000 Items.\n"..
|
||||
"\n"..
|
||||
"Falls die Suche erfolglos war\\, musst du den Block ca. 16 m weiter setzen.\n"..
|
||||
"Der Ölexplorer sucht immer innerhalb des ganzen Map-Blocks und darunter nach Öl\\, in dem er gesetzt wurde. Eine erneute Suche im gleichen Map-Block (16x16 Feld) macht daher keinen Sinn.\n"..
|
||||
"\n"..
|
||||
"Falls Öl gefunden wurde\\, wird die Stelle für den Bohrturm angezeigt. Du musst den Bohrturm innerhalb des angezeigten Bereiches errichten\\, die Stelle am besten gleich mit einem Schild markieren und den ganzen Bereich gegen fremde Spieler schützen.\n"..
|
||||
"\n"..
|
||||
"Gib die Suche nach Öl nicht zu schnell auf. Es kann wenn du Pech hast\\, sehr lange dauern\\, bis du eine Ölquelle gefunden hast.\n"..
|
||||
"Es macht auch keinen Sinn\\, einen Bereich den ein anderer Spieler bereits abgesucht hat\\, nochmals abzusuchen. Die Chance\\, irgendwo Öl zu finden\\, ist für alle Spieler gleich.\n"..
|
||||
"\n"..
|
||||
"Der Ölexplorer kann immer wieder zur Suche nach Öl eingesetzt werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Ölbohrkiste muss an die Stelle gesetzt werden\\, die vom Ölexplorer angezeigt wurde. An anderen Stellen nach Öl zu bohren ist zwecklos.\n"..
|
||||
"Wird auf den Button der Ölbohrkiste geklickt\\, wird über der Kiste ein Bohrturm errichtet. Dies dauert einige Sekunden.\n"..
|
||||
"Die Ölbohrkiste hat 4 Seiten\\, bei IN muss das Bohrgestänge über Schieber angeliefert und bei OUT muss das Bohrmaterial abtransportiert werden. Über eine der anderen zwei Seiten muss die Ölbohrkiste mit Strom versorgt werden.\n"..
|
||||
"\n"..
|
||||
"Die Ölbohrkiste bohrt bis zum Ölfeld (1 Meter in 16 s) und benötigt dazu 16 ku Strom.\n"..
|
||||
"Wurde das Ölfeld erreicht\\, kann der Bohrturm abgebaut und die Kiste entfernt werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"An die Stelle der Ölbohrkiste muss nun die Ölpumpe platziert werden. Auch die Ölpumpe benötigt Strom (16 ku) und liefert alle 8 s ein Einheit Erdöl. Das Erdöl muss in einem Tank gesammelt werden. Dazu muss die Ölpumpe über eine Leitung (gelbe Röhre) mit dem Tank verbunden werden.\n"..
|
||||
"Ist alles Öl abgepumpt\\, kann auch die Ölpumpe wieder entfernt werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Das Bohrgestänge wird für die Bohrung benötigt. Es werden so viele Bohrgestänge Items benötigt wie als Tiefe für das Ölfeld angegeben wurde. Das Bohrgestänge ist nach der Bohrung nutzlos\\, kann aber auch nicht abgebaut werden und verbleibt im Boden. Es gibt aber ein Werkzeug\\, um die Bohrgestänge Blöcke wieder entfernen zu können (-> Werkzeuge -> TA3 Bohrgestängezange).\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Öltank ist die große Ausführung des TA3 Tanks (siehe Flüssigkeiten -> TA3 Tank).\n"..
|
||||
"\n"..
|
||||
"Der große Tank kann 4000 Einheiten Öl\\, aber auch jede andere Art von Flüssigkeit aufnehmen.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"",
|
||||
"Um Öl von der Ölquelle zur Ölverarbeitungsanlage zu befördern\\, können Tankwagen (tank carts) genutzt werden. Ein Tankwagen kann direkt über Pumpen gefüllt bzw. geleert werden. In beiden Fällen muss die gelbe Röhre von oben mit dem Tankwagen verbunden werden.\n"..
|
||||
"\n"..
|
||||
"Dazu sind folgende Schritte notwendig:\n"..
|
||||
"\n"..
|
||||
" - Den Tankwagen vor den Prellbock setzen. Der Prellbock darf noch nicht mit einer Zeit programmiert sein\\, so dass der Tankwagen nicht automatisch losfährt\n"..
|
||||
" - Den Tankwagen über gelbe Röhren mit der Pumpe verbinden\n"..
|
||||
" - Pumpe einschalten\n"..
|
||||
" - Prellbock mit einer Zeit (10 - 20 s) programmieren\n"..
|
||||
"\n"..
|
||||
"Diese Reihenfolge muss auf beiden Seiten /Füllen/Leeren) eingehalten werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"In die Minecarts können Kanister und Fässer geladen werden. Das Öl muss dazu zuvor in Fässer umgeladen werden. Die Ölfässer können direkt mit einem Schieber und Röhren in das Minecart geschoben werden (siehe Plan). Die leeren Fässer\\, welche per Minecart von der Entladestation zurück kommen\\, können über einen Hopper entladen werden\\, der unter der Schiene an der Haltestelle platziert wird.\n"..
|
||||
"\n"..
|
||||
"Es ist mit dem Hopper nicht möglich\\, an *einer* Haltestelle sowohl die leeren Fässer zu entladen\\, als auch die vollen Fässer zu beladen. Der Hopper lädt die vollen Fässer sofort wieder aus. Daher ist es ratsam\\, jeweils 2 Stationen auf der Be- und Entladeseite einzurichten und den Minecart dann über eine Aufzeichnungsfahrt entsprechend zu programmieren.\n"..
|
||||
"\n"..
|
||||
"Der Plan zeigt\\, wie das Öl in einen Tank gepumpt und über einen Einfülltrichter in Fässer umgefüllt und in Minecarts geladen werden kann.\n"..
|
||||
"\n"..
|
||||
"Damit die Minecarts automatisch wieder starten\\, müssen die Prellböcke mit Stationsname und Wartezeit konfiguriert werden. Für das Entladen reichen 5 s. Da aber die Schieber immer für mehrere Sekunden in den Standby fallen\\, wenn kein Minecart da ist\\, muss für das Beladen eine Zeit von 15 oder mehr Sekunden eingegeben werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Tankwagen dient zum Transport von Flüssigkeiten. Es kann wie Tanks mit Pumpen gefüllt bzw. geleert werden. In beiden Fällen muss die gelbe Röhre von oben mit dem Tankwagen verbunden werden.\n"..
|
||||
"\n"..
|
||||
"In den Tankwagen passen 200 Einheiten.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Kistenwagen dient zum Transport von Items. Es kann wie Kisten über Schieber gefüllt bzw. geleert werden.\n"..
|
||||
"\n"..
|
||||
"In den Kistenwagen passen 4 Stacks.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Öl ist ein Stoffgemisch und besteht aus sehr vielen Komponenten. Über einen Destillationsturm kann das Öl in seine Hauptbestandteile wie Bitumen\\, Schweröl\\, Naphtha\\, Benzin und Gas zerlegt werden.\n"..
|
||||
"Die weitere Verarbeitung zu Endprodukten erfolgt im Chemischen Reaktor.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Destillationsturm muss wie im Plan rechts oben aufgebaut werden. \n"..
|
||||
"Über den Basisblock wird das Bitumen abgelassen. Der Ausgang ist auf der Rückseite des Basisblocks (Pfeilrichtung beachten).\n"..
|
||||
"Auf diesen Basisblock kommen die \"Destillationsturm\" Blöcke mit den Nummern: 1\\, 2\\, 3\\, 2\\, 3\\, 2\\, 3\\, 4\n"..
|
||||
"An den Öffnungen von unten nach oben werden Schweröl\\, Naphtha und Benzin abgeleitet. Ganz oben wird das Propangas abgefangen.\n"..
|
||||
"Es müssen alle Öffnungen am Turm mit Tanks verbunden werden.\n"..
|
||||
"Der Aufkocher (reboiler) muss mit dem Block \"Destillationsturm 1\" verbunden werden.\n"..
|
||||
"\n"..
|
||||
"Der Aufkocher benötigt Strom (nicht im Plan zu sehen)!\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Aufkocher erhitzt das Erdöl auf ca. 400°C. Dabei verdampft es weitgehend und wird in den Destillationsturm zur Abkühlung geleitet.\n"..
|
||||
"\n"..
|
||||
"Der Aufkocher benötigt 14 Einheiten Strom und produziert alle 16 s jeweils eine Einheit Bitumen\\, Schweröl\\, Naphtha\\, Benzin und Propangas.\n"..
|
||||
"Dazu muss der Aufkocher über einen Pumpe mit Erdöl versorgt werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Neben den Röhren für Warentransport\\, sowie den Gas- und Stromleitungen gibt es auch noch eine drahtlose Kommunikationsebene\\, über die Blöcke untereinander Daten austauschen können. Dafür müssen keine Leitungen gezogen werden\\, sondern die Verbindung zwischen Sender und Empfänger erfolgt nur über die Blocknummer. Alle Blöcke\\, die an dieser Kommunikation teilnehmen können\\, zeigen die Blocknummer als Info-Text an\\, wenn man mit dem Mauscursor den Block fixiert.\n"..
|
||||
"Welche Kommandos ein Block unterstützt\\, kann mit dem TechAge Info Werkzeug (Schraubenschlüssel) ausgelesen und angezeigt werden.\n"..
|
||||
"Die einfachsten Kommandos\\, die von fast allen Blöcken unterstützt werden\\, sind:\n"..
|
||||
"\n"..
|
||||
" - 'on' - Block/Maschine/Lampe einschalten\n"..
|
||||
" - 'off' - Block/Maschine/Lampe ausschalten\n"..
|
||||
"\n"..
|
||||
"Mir Hilfe des TA3 Terminal können diese Kommandos sehr einfach ausprobiert werden. Angenommen\\, eine Signallampe hat die Nummer 123.\n"..
|
||||
"Dann kann mit:\n"..
|
||||
"\n"..
|
||||
" cmd 123 on\n"..
|
||||
"\n"..
|
||||
"die Lampe ein\\, und mit:\n"..
|
||||
"\n"..
|
||||
" cmd 123 off\n"..
|
||||
"\n"..
|
||||
"die Lampe wieder ausgeschaltet werden. Diese Kommandos müssen so in das Eingabefeld des TA3 Terminals eingegeben werden.\n"..
|
||||
"\n"..
|
||||
"Kommandos wie 'on' und 'off' werden zum Empfänger gesendet\\, ohne dass eine Antwort zurück kommt. Diese Kommandos können daher bspw. mit einem Taster/Schalter auch gleichzeitig an mehrere Empfänger gesendet werden\\, wenn dort im Eingabefeld mehrere Nummern eingegeben werden.\n"..
|
||||
"\n"..
|
||||
"Ein Kommandos wie 'state' fordert den Status eines Blockes an. Der Block sendet in Folge seinen Status zurück. Diese Art von bestätigten Kommandos kann gleichzeitig nur an einen Empfänger gesendet werden.\n"..
|
||||
"Auch dieses Kommandos kann mit dem TA3 Terminal bspw. an einem Schieber ausprobiert werden:\n"..
|
||||
"\n"..
|
||||
" cmd 123 state\n"..
|
||||
"\n"..
|
||||
"Mögliche Antworten des Schiebers sind:\n"..
|
||||
"\n"..
|
||||
" - 'running' --> bin am arbeiten\n"..
|
||||
" - 'stopped' --> ausgeschaltet\n"..
|
||||
" - 'standby' --> nichts zu tun\\, da Quell-Inventar leer\n"..
|
||||
" - 'blocked' --> kann nichts tun\\, da Ziel-Inventar voll\n"..
|
||||
"\n"..
|
||||
"Dieser Status und weitere Informationen werden auch ausgegeben\\, wenn mit dem Schraubenschlüssel auf den Block geklickt wird.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Taster/Schalter sendet 'on'/'off' Kommandos zu den Blöcken\\, die über die Nummern konfiguriert wurden.\n"..
|
||||
"Der Taster/Schalter kann als Taster (button) oder Schalter (switch) konfiguriert werden. Wird er als Taster konfiguriert\\, so kann die Zeit zwischen den 'on' und 'off' Kommandos eingestellt werden. Mit der Betriebsart \"on button\" wird nur ein 'on' und kein 'off' Kommandos gesendet.\n"..
|
||||
"\n"..
|
||||
"Über die Checkbox \"public\" kann eingestellt werden\\, ob den Taster von jedem (gesetzt)\\, oder nur vom Besitzer selbst (nicht gesetzt) genutzt werden darf.\n"..
|
||||
"\n"..
|
||||
"Hinweis: Mit dem Programmer können Blocknummern sehr einfach eingesammelt und konfiguriert werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit dem TA3 Kommando Konverter können 'on' / 'off' Kommandos in andere Kommandos umgewandelt werden\\, sowie die Weiterleitung verhindert oder verzögert werden. Die Nummer des Zielblockes bzw. die Nummern der Zielblöcke\\, die Kommandos die gesendet werden sollen\\, sowie die Verzögerungszeiten in Sekunden müssen eingegeben werden. Wird kein Kommando eingegeben\\, wird nichts gesendet.\n"..
|
||||
"\n"..
|
||||
"Die Nummern können auch mit Hilfe des Techage Programmers programmiert werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Das TA3 Flipflop wechselt seinen Zustand mit jedem empfangenen 'on' Kommando. Empfangene 'off' Kommandos werden ignoriert. Damit werden abhängig vom Zustandswechsel abwechselnd 'on' / 'off' Kommandos gesendet. Die Nummer des Zielblockes bzw. die Nummern der Zielblöcke müssen eingegeben werden. Die Nummern können auch mit Hilfe des Techage Programmers programmiert werden.\n"..
|
||||
"\n"..
|
||||
"Damit lassen sich bspw. Lampen mit Hilfe von Tastern ein- und wieder ausschalten.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Den TA3 Logikblock kann man so programmieren\\, dass ein oder mehrere Eingangskommandos zu einem Ausgangskommando verknüpft und gesendet werden. Dieser Block kann daher diverse Logik-Elemente wie AND\\, OR\\, NOT\\, XOR usw. ersetzen.\n"..
|
||||
"Eingangkommandos für den Logikblock sind 'on'/'off' Kommandos.\n"..
|
||||
"Eingangskommandos werden über die Nummer referenziert\\, also bspw. '1234' für das Kommando vom Sender mit der Nummer 1234.\n"..
|
||||
"Das gleiche gilt für Ausgangskommandos.\n"..
|
||||
"\n"..
|
||||
"Eine Regel ist wie folgt aufgebaut:\n"..
|
||||
"\n"..
|
||||
" <output> = on/off if <input-expression> is true\n"..
|
||||
"\n"..
|
||||
"'<output>' ist die Nummer des Blocks\\, zu dem das Kommando gesendet werden soll.\n"..
|
||||
"'<input-expression>' ist ein boolescher Ausdruck\\, bei dem Eingabenummern ausgewertet werden. \n"..
|
||||
"\n"..
|
||||
"*Beispiele für den Input Ausdruck*\n"..
|
||||
"\n"..
|
||||
"Signal negieren (NOT):\n"..
|
||||
"\n"..
|
||||
" 1234 == off\n"..
|
||||
"\n"..
|
||||
"Logisches UND (AND):\n"..
|
||||
"\n"..
|
||||
" 1234 == on and 2345 == on\n"..
|
||||
"\n"..
|
||||
"Logisches ODER (OR):\n"..
|
||||
"\n"..
|
||||
" 1234 == on or 2345 == on\n"..
|
||||
"\n"..
|
||||
"Folgende Operatoren sind zulässig: 'and' 'or' 'on' 'off' 'me' '==' '~=' '(' ')'\n"..
|
||||
"\n"..
|
||||
"Ist der Ausdruck wahr (true)\\, wird ein Kommando an den Block mit der '<output>' Nummer gesendet.\n"..
|
||||
"\n"..
|
||||
"Es können bis zu vier Regeln definiert werden\\, wobei immer alle Regeln geprüft werden\\, wenn ein Kommando empfangen wird.\n"..
|
||||
"\n"..
|
||||
"Die interne Durchlaufzeit aller Kommandos beträgt 100 ms.\n"..
|
||||
"\n"..
|
||||
"Über das Schlüsselwort 'me' kann die eigene Knotennummer referenziert werden. Damit ist es möglich\\, dass sich der Block selbst ein Kommando sendet (Flip-Flop Funktion).\n"..
|
||||
"\n"..
|
||||
"Die Sperrzeit definiert eine Pause nach einem Kommando\\, in der der Logikblock kein weiteres Kommando von extern annimmt. Empfangene Kommandos in der Sperrzeit werden damit verworfen. Die Sperrzeit kann in Sekunden definiert werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Wiederholer (repeater) sendet das empfangene Signal an alle konfigurierten Nummern weiter.\n"..
|
||||
"Dies kann bspw. Sinn machen\\, wenn man viele Blöcke gleichzeitig angesteuert werden sollen. Den Wiederholer kann man dazu mit dem Programmer konfigurieren\\, was nicht bei allen Blöcken möglich ist.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Sequenzer kann eine Reihe von 'on'/'off' Kommandos senden\\, wobei der Abstand zwischen den Kommandos in Sekunden angegeben werden muss. Damit kann man bspw. eine Lampe blinken lassen.\n"..
|
||||
"Es können bis zu 8 Kommandos konfiguriert werden\\, jedes mit Zielblocknummer und Anstand zum nächsten Kommando.\n"..
|
||||
"Der Sequenzer wiederholt die Kommandos endlos\\, wenn \"Run endless\" gesetzt wird.\n"..
|
||||
"Wird also Kommando nichts ausgewählt\\, wird nur die angegeben Zeit in Sekunden gewartet.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Timer kann Kommandos Spielzeit-gesteuert senden. Für jede Kommandozeile kann die Uhrzeit\\, die Zielnummer(n) und das Kommando selbst angegeben werden. Damit lassen sich bspw. Lampen abends ein- und morgens wieder ausschalten.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Das Terminal dient in erster Linie zum Austesten der Kommandoschnittstelle anderer Blöcke (siehe \"Logik-/Schalt-Blöcke\").\n"..
|
||||
"Man kann aber auch Kommandos auf Tasten legen und so das Terminal produktiv nutzen.\n"..
|
||||
"\n"..
|
||||
" set <button-num> <button-text> <command>\n"..
|
||||
"\n"..
|
||||
"Mit 'set 1 ON cmd 123 on' kann bspw. die Usertaste 1 mit dem Kommando 'cnd 123 on' programmiert werden. Wird die Taste gedrückt\\, wird das Kommando gesendet und die Antwort auf dem Bildschirm ausgegeben.\n"..
|
||||
"\n"..
|
||||
"Das Terminal besitzt folgende\\, lokalen Kommandos:\n"..
|
||||
"\n"..
|
||||
" - 'clear' lösche Bildschirm\n"..
|
||||
" - 'help' gib eine Hilfeseite aus\n"..
|
||||
" - 'pub' schalte in den öffentlichen Modus um\n"..
|
||||
" - 'priv' schalte in den privaten Modus um\n"..
|
||||
"\n"..
|
||||
"Im privaten Modus (private) kann das Terminal nur von Spielern verwendet werden\\, die an diesem Ort bauen können\\, also Protection Rechte besitzen. Im öffentlichen Modus (public) können alle Spieler die vorkonfigurierten Tasten verwenden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Farblampe kann mit 'on'/'off' Kommando ein- bzw. ausgeschaltet werden. Diese Lampe braucht keinen Strom und\n"..
|
||||
"kann mit der Spritzpistole aus der Mod \"Unified Dyes\" und über Lua/Beduino Kommandos eingefärbt werden.\n"..
|
||||
"\n"..
|
||||
"Mit dem Chat-Kommando '/ta_color' wird die Farbpalette mit den Werten für die Lua/Beduino Kommandos angezeigt und mit '/ta_send color <num>' kann die Farbe geändert werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit diese Blöcken kann man Türe und Tore realisieren\\, die über Kommandos geöffnet (Blöcke verschwinden) und wieder geschlossen werden können. Pro Tor oder Tür wird dazu ein Tür Controller benötigt. \n"..
|
||||
"\n"..
|
||||
"Das Aussehen der Blöcke kann über das Block-Menü eingestellt werden.\n"..
|
||||
"Damit lassen sich Geheimtüren realisieren\\, die sich nur bei bestimmten Spielern öffnen (mit Hilfe des Spieler-Detektors). \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Tür Controller dient zur Ansteuerung der TA3 Tür/Tor Blöcke. Beim Tür Controller müssen die Nummern der Tür/Tor Blöcke eingegeben werden. Wird ein 'on'/'off' Kommando Kommando an den Tür Controller gesendet\\, öffnet/schließt dieser die Tür bzw. das Tor.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Tür Controller II kann alle Arten von Blöcken entfernen und wieder setzen. Um den Tür Controller II anzulernen\\, muss der \"Aufzeichnen\" Button gedrückt werden. Dann müssen alle Blöcke angeklickt werden\\, die Teil der Tür / des Tores sein sollen. Danach muss der \"Fertig\" Button gedrückt werden. Es können bis zu 16 Blöcke ausgewählt werden. Die entfernten Blöcke werden im Inventar des Controllers gespeichert.\n"..
|
||||
"\n"..
|
||||
" Über die Tasten \"Entfernen\" bzw. \"Setzen\" kann die Funktion des Controllers von Hand getestet werden.\n"..
|
||||
"\n"..
|
||||
"Wird ein 'on' / 'off' Kommando an den Tür Controller II gesendet\\, entfernt bzw. setzt er die Blöcke ebenfalls.\n"..
|
||||
"\n"..
|
||||
"Mit '$send_cmnd(node_number\\, \"exchange\"\\, 2)' können einzelne Böcke gesetzt\\, entfernt\\, bzw. durch andere Blöcke aus dem Inventar ersetzt werden. \n"..
|
||||
"\n"..
|
||||
"Mit '$send_cmnd(node_number\\, \"set\"\\, 2)' kann ein Block aus dem Inventory explizit gesetzt werden\\, sofern der Inventory Slot nicht leer ist.\n"..
|
||||
"\n"..
|
||||
"Mit '$send_cmnd(node_number\\, \"dig\"\\, 2)' kann ein Block wieder entfernt werden\\, sofern der Inventory Slot leer ist. \n"..
|
||||
"\n"..
|
||||
"Mit '$send_cmnd(node_number\\, \"get\"\\, 2)' wird der Name des gesetzten Blocks zurückgeliefert. \n"..
|
||||
"\n"..
|
||||
"Die Slot-Nummer des Inventars (1 .. 16) muss in allen drei Fällen als payload übergeben werden.\n"..
|
||||
"\n"..
|
||||
"Damit lassen sich auch ausfahrbare Treppen und ähnliches simulieren.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mir dem Sound Block können veschiedene Sounds/Laute abgespielt werden. Es sind alle Sounds der Mods Techage\\, Signs Bot\\, Hyperloop\\, Unified Inventory\\, TA4 Jetpack und Minetest Game verfügbar.\n"..
|
||||
"\n"..
|
||||
"Die Sounds können über das Menü und über ein Kommando ausgewählt und abgespielt werden.\n"..
|
||||
"\n"..
|
||||
" - Kommando 'on' zum Abspielen eines Sounds\n"..
|
||||
" - Kommando 'sound <idx>' zur Auswahl eines Sounds über den Index\n"..
|
||||
" - Kommando 'gain <volume>' zum Einstellen der Lautstärke über den '<volume>' Wert (1 bis 5).\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Mesecons Umsetzer dient zur Umwandlung von Techage on/off Kommandos in Mesecons Signale und umgekehrt.\n"..
|
||||
"Dazu müssen eine oder mehrere Knotennummern eingegeben und der Konverter mit Mesecons Blöcken \n"..
|
||||
"über Mesecons Leitungen verbunden werden. Den Mesecons Umsetzer kann man auch mit dem Programmer konfigurieren.\n"..
|
||||
"Der Mesecons Umsetzer akzeptiert bis zu 5 Kommandos pro Sekunde\\, bei höherer Belastung schaltet er sich ab.\n"..
|
||||
"\n"..
|
||||
"*Dieser Block existiert aber nur\\, wenn die Mod mesecons aktiv ist!*\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Detektoren scannen ihre Umgebung ab und senden ein 'on'-Kommando\\, wenn das Gesuchte erkannt wurde.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Detektor ist eine spezieller Röhrenblock\\, der erkennt\\, wenn Items über die Röhre weitergegeben werden. Es muss dazu auf beiden Seiten mit der Röhre verbunden sein. Werden Items mit einem Schieber in den Detektor geschoben\\, gibt er diese automatisch weiter.\n"..
|
||||
"Er sendet ein 'on'\\, wenn ein Item erkannt wird\\, gefolgt von einem 'off' eine Sekunde später.\n"..
|
||||
"Danach werden weitere Kommando für 8 Sekunden blockiert.\n"..
|
||||
"Die Wartezeit\\, sowie die Items\\, die ein Kommando auslösen sollen\\, können über das Gabelschlüssel-Menü konfiguriert werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Wagen Detektor sendet ein 'on'-Kommando\\, wenn er einen Wagen/Cart (Minecart) direkt vor sich erkannt hat. Zusätzlich kann der Detektor auch den Wagen wieder starten\\, wenn ein 'on'-Kommando empfangen wird.\n"..
|
||||
"\n"..
|
||||
"Der Detektor kann auch mit seiner eigenen Nummer programmiert werden. In diesem Falle schiebt er alle Wagen an\\, die in seiner Nähe (ein Block in alle Richtungen) zum Halten kommen.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Block Detektor sendet ein 'on'-Kommando\\, wenn er erkennt\\, dass Blöcke vor ihm erscheinen oder verschwinden\\, muss jedoch entsprechend konfiguriert werden. Nach dem Zurückschalten des Detektors in den Standardzustand (grauer Block) wird ein 'off'-Kommando gesendet. Gültige Blöcke sind alle Arten von Blöcken und Pflanzen\\, aber keine Tiere oder Spieler. Die Sensorreichweite beträgt 3 Blöcke/Meter in Pfeilrichtung.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Spieler Detektor sendet ein 'on'-Kommando\\, wenn er einen Spieler in einem Umkreis von 4 m um den Block herum erkennt. Verlässt der Spieler wieder den Bereich\\, wird ein 'off'-Kommando gesendet.\n"..
|
||||
"Soll die Suche auf bestimmte Spieler eingegrenzt werden\\, so können diese Spielernamen auch eingegeben werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Lichtdetektor sendet einen 'on'-Kommando\\, wenn der Lichtpegel des darüber liegenden Blocks einen bestimmten Pegel überschreitet\\, der über das Rechtsklickmenü eingestellt werden kann.\n"..
|
||||
"Mit einen TA4 Lua Controller kann die genaue Lichtstärke mit $get_cmd(num\\, 'light_level') ermitteln werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Bei TA3 existieren die gleichen Maschinen wie bei TA2\\, nur sind diese hier leistungsfähiger und benötigen Strom statt Achsenantrieb.\n"..
|
||||
"Im folgenden sind daher nur die unterschiedlichen\\, technischen Daten angegeben.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Funktion entspricht der von TA2.\n"..
|
||||
"Die Verarbeitungsleistung beträgt 6 Items alle 2 s.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Funktion des TA3 Verteilers entspricht der von TA2.\n"..
|
||||
"Die Verarbeitungsleistung beträgt 12 Items alle 4 s.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Funktion entspricht der von TA2.\n"..
|
||||
"Die Verarbeitungsleistung beträgt 2 Items alle 4 s. Der Autocrafter benötigt hierfür 6 ku Strom.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Funktion entspricht der von TA2\\, nur werden hier TA4 WLAN Chips produziert.\n"..
|
||||
"Die Verarbeitungsleistung beträgt ein Chip alle 6 s. Der Block benötigt hierfür 12 ku Strom.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Funktion entspricht der von TA2.\n"..
|
||||
"Die maximale Tiefe beträgt 40 Meter. Der Steinbrecher benötigt 12 ku Strom.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Funktion entspricht der von TA2.\n"..
|
||||
"Die Verarbeitungsleistung beträgt 2 Items alle 4 s. Der Block benötigt 4 ku Strom.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Funktion entspricht der von TA2.\n"..
|
||||
"Auch die Wahrscheinlichkeit ist wie bei TA2. Der Block benötigt auch 3 ku Strom.\n"..
|
||||
"Aber im Gegensatz zu TA2 kann beim TA3 Block bspw. der Status abgefragt werden (Controller)\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Funktion entspricht der von TA2.\n"..
|
||||
"Die Verarbeitungsleistung beträgt 2 Items alle 4 s. Der Block benötigt 6 ku Strom.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Injektor ist ein TA3 Schieber mit speziellen Eigenschaften. Er besitzt ein Menü zur Konfiguration. Hier können bis zu 8 Items konfiguriert werden. Er entnimmt nur diese Items einer Kiste um sie an Maschinen mit Rezepturen weiterzugeben (Autocrafter\\, Industrieofen und Elektronikfabrik).\n"..
|
||||
"\n"..
|
||||
"Beim Weitergeben wird in der Zielmaschine pro Item nur eine Position im Inventar genutzt. Sind bspw. nur die ersten drei Einträge im Injektor konfiguriert\\, so werden auch nur die ersten drei Speicherplätze im Inventar der Maschine belegt. Damit wir ein Überlauf im Inventar der Maschine verhindert.\n"..
|
||||
"\n"..
|
||||
"Der Injektor kann auch auf \"Ziehe-Modus\" umgeschaltet werden. Dann zieht er nur Items von den Positionen aus der Kiste\\, die in der Konfiguration des Injektors definiert sind. Hier müssen also Item-Typ und Position überein stimmen. Damit können geziehlt Speicherplätze im Inventar einer Kiste geleert werden.\n"..
|
||||
"\n"..
|
||||
"Die Verarbeitungsleistung beträgt bis zu 8 mal ein Item alle 4 Sekunden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"",
|
||||
"Das Techage Info Tool (Schraubenschlüssel) hat verschiedene Funktionen. Er zeigt die Uhrzeit\\, die Position\\, die Temperatur und das Biome an\\, wenn auf einen unbekannten Block geklickt wird.\n"..
|
||||
"Wird auf einen TechAge Block mit Kommandoschnittstelle geklickt\\, werden alle verfügbaren Daten abgerufen (siehe auch \"Logik-/Schalt-Blöcke\").\n"..
|
||||
"\n"..
|
||||
"Mit Shift+Rechtsklick kann bei einigen Blöcken ein erweitertes Menü geöffnet werden. Hier lassen sich je nach Block weitere Daten abrufen oder spezielle Einstellungen vornehmen. Bei einem Generator kann bspw. die Ladekurve/abschaltung programmiert werden. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit dem Programmer können Blocknummern mit einem Rechtsklick von mehreren Blöcken eingesammelt und mit einem Linksklick in einen Block wie Taster/Schalter geschrieben werden.\n"..
|
||||
"Wird in die Luft geklickt\\, wird der interne Speicher gelöscht.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Kelle dient zum Verputzen von Stromkabel. Siehe dazu \"TA Stromkabel\".\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Mit diesem Werkzeug lassen sich die Bohrgestängezange Blöcke wieder entfernen\\, wenn dort bspw. ein Tunnel durch soll.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Techage Schraubendreher dient als Ersatz für den normalen Schraubendreher. Es besitzt folgende Funktionen:\n"..
|
||||
"\n"..
|
||||
" - Linksklick: Den Block nach links drehen\n"..
|
||||
" - Rechtsklick: Die sichtbare Seite des Blockes nach oben drehen\n"..
|
||||
" - Shift+Linksklick: Ausrichtung des angeklickten Blockes speichern\n"..
|
||||
" - Shift+Rechtsklick: Die gespeicherte Ausrichtung auf den angeklickten Block anwenden\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
},
|
||||
images = {
|
||||
"techage_ta3",
|
||||
"",
|
||||
"ta3_firebox",
|
||||
"ta3_oilbox",
|
||||
"ta3_boiler",
|
||||
"ta3_turbine",
|
||||
"ta3_generator",
|
||||
"ta3_cooler",
|
||||
"ta3_powerswitch",
|
||||
"power_reduction",
|
||||
"ta3_powercable",
|
||||
"ta3_powerjunction",
|
||||
"ta3_powerline",
|
||||
"ta3_powerpole",
|
||||
"ta3_powerpole4",
|
||||
"ta3_powerpole2",
|
||||
"ta3_powerswitch",
|
||||
"ta3_powerswitchsmall",
|
||||
"ta3_powerswitchbox",
|
||||
"ta3_tinygenerator",
|
||||
"ta3_akkublock",
|
||||
"ta3_powerterminal",
|
||||
"ta3_motor",
|
||||
"",
|
||||
"ta3_furnacefirebox",
|
||||
"ta3_furnace",
|
||||
"ta3_booster",
|
||||
"",
|
||||
"ta3_tank",
|
||||
"ta3_pump",
|
||||
"ta3_filler",
|
||||
"ta3_pipe",
|
||||
"ta3_pipe_wall_entry",
|
||||
"ta3_valve",
|
||||
"techage_ta3",
|
||||
"ta3_oilexplorer",
|
||||
"ta3_drillbox",
|
||||
"ta3_pumpjack",
|
||||
"ta3_drillbit",
|
||||
"oiltank",
|
||||
"",
|
||||
"tank_cart",
|
||||
"",
|
||||
"tank_cart",
|
||||
"chest_cart",
|
||||
"techage_ta31",
|
||||
"",
|
||||
"reboiler",
|
||||
"ta3_logic",
|
||||
"ta3_button",
|
||||
"ta3_command_converter",
|
||||
"ta3_flipflop",
|
||||
"ta3_logic",
|
||||
"ta3_repeater",
|
||||
"ta3_sequencer",
|
||||
"ta3_timer",
|
||||
"ta3_terminal",
|
||||
"ta3_colorlamp",
|
||||
"ta3_doorblock",
|
||||
"ta3_doorcontroller",
|
||||
"ta3_doorcontroller",
|
||||
"ta3_soundblock",
|
||||
"ta3_mesecons_converter",
|
||||
"ta3_nodedetector",
|
||||
"ta3_detector",
|
||||
"ta3_cartdetector",
|
||||
"ta3_nodedetector",
|
||||
"ta3_playerdetector",
|
||||
"ta3_lightdetector",
|
||||
"ta3_grinder",
|
||||
"ta3_pusher",
|
||||
"ta3_distributor",
|
||||
"ta3_autocrafter",
|
||||
"ta3_electronicfab",
|
||||
"ta3_quarry",
|
||||
"ta3_gravelsieve",
|
||||
"ta3_gravelrinser",
|
||||
"ta3_grinder",
|
||||
"ta3_injector",
|
||||
"",
|
||||
"ta3_end_wrench",
|
||||
"ta3_programmer",
|
||||
"ta3_trowel",
|
||||
"ta3_drill_pipe_wrench",
|
||||
"ta3_screwdriver",
|
||||
},
|
||||
plans = {
|
||||
"",
|
||||
"coalpowerstation",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta3_furnace",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta3_tank",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta3_loading",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta3_distiller",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
}
|
||||
}
|
916
techage/doc/manual_ta3_EN.lua
Normal file
@ -0,0 +1,916 @@
|
||||
return {
|
||||
titles = {
|
||||
"1,TA3: Oil Age",
|
||||
"2,Coal-fired Power Station / Oil-fired Power Station",
|
||||
"3,TA3 power station firebox",
|
||||
"3,TA3 Power Station Oil Burner",
|
||||
"3,TA3 boiler base / top",
|
||||
"3,TA3 turbine",
|
||||
"3,TA3 generator",
|
||||
"3,TA3 cooler",
|
||||
"2,Electrical current",
|
||||
"3,Importance of storage systems",
|
||||
"3,TA Electric Cable",
|
||||
"3,TA Electric Junction Box",
|
||||
"3,TA Power Line",
|
||||
"3,TA Power Pole",
|
||||
"3,TA Power Pole Top",
|
||||
"3,TA Power Pole Top 2",
|
||||
"3,TA Power Switch",
|
||||
"3,TA Power Switch Small",
|
||||
"3,TA Power Switch Box",
|
||||
"3,TA3 Small Power Generator",
|
||||
"3,TA3 Battery Block",
|
||||
"3,TA3 Power Terminal",
|
||||
"3,TA3 Electric Motor",
|
||||
"2,TA3 Industrial Furnace",
|
||||
"3,TA3 Furnace Oil Burner",
|
||||
"3,TA3 Furnace Top",
|
||||
"3,TA3 Booster",
|
||||
"2,Liquids",
|
||||
"3,TA3 Tank",
|
||||
"3,TA3 Pump",
|
||||
"3,TA Liquid Filler",
|
||||
"3,TA4 Pipe",
|
||||
"3,TA3 Pipe Wall Entry Blocks",
|
||||
"3,TA Valve",
|
||||
"2,Oil Production",
|
||||
"3,TA3 Oil Explorer",
|
||||
"3,TA3 Oil Drill Box",
|
||||
"3,TA3 Oil Pumpjack",
|
||||
"3,TA3 Drill Pipe",
|
||||
"3,Oil tank",
|
||||
"2,Oil Transportation",
|
||||
"3,Oil transportation by Tank Carts",
|
||||
"3,Oil transportation with barrels over Minecarts",
|
||||
"3,Tank Cart",
|
||||
"3,Chest Cart",
|
||||
"2,Oil Processing",
|
||||
"3,Distillation Tower",
|
||||
"4,Reboiler",
|
||||
"2,Logic / Switching Blocks",
|
||||
"3,TA3 Button / Switch",
|
||||
"3,TA3 Command Converter",
|
||||
"3,TA3 Flip-Flop",
|
||||
"3,TA3 Logic Block",
|
||||
"3,TA3 Repeater",
|
||||
"3,TA3 Sequencer",
|
||||
"3,TA3 Timer",
|
||||
"3,TA3 Terminal",
|
||||
"3,TechAge Color Lamp",
|
||||
"3,Door/Gate Blocks",
|
||||
"3,TA3 Door Controller",
|
||||
"3,TA3 Door Controller II",
|
||||
"3,TA3 Sound Block",
|
||||
"3,TA3 Mesecons Converter",
|
||||
"2,Detectors",
|
||||
"3,TA3 Detector",
|
||||
"3,TA3 Cart Detector",
|
||||
"3,TA3 Node Detector",
|
||||
"3,TA3 Player Detector",
|
||||
"3,TA3 Light Detector",
|
||||
"2,TA3 Machines",
|
||||
"3,TA3 Pusher",
|
||||
"3,TA3 Distributor",
|
||||
"3,TA3 Autocrafter",
|
||||
"3,TA3 Electronic Fab",
|
||||
"3,TA3 Quarry",
|
||||
"3,TA3 Gravel Sieve",
|
||||
"3,TA3 Gravel Rinser",
|
||||
"3,TA3 Grinder",
|
||||
"3,TA3 Injector",
|
||||
"2,Tools",
|
||||
"3,Techage Info Tool",
|
||||
"3,TechAge Programmer",
|
||||
"3,TechAge Trowel / Trowel",
|
||||
"3,TA3 drill pipe wrench",
|
||||
"3,Techage Screwdriver",
|
||||
},
|
||||
texts = {
|
||||
"At TA3 it is important to replace the steam-powered machines with more powerful and electric-powered machines.\n"..
|
||||
"\n"..
|
||||
"To do this\\, you have to build coal-fired power plants and generators. You will soon see that your electricity needs can only be met with oil-powered power plants. So you go looking for oil. Drilling derricks and oil pumps help them get the oil. Railways are used to transport oil to the power plants.\n"..
|
||||
"\n"..
|
||||
"The industrial age is at its peak.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The coal-fired power plant consists of several blocks and must be assembled as shown in the plan on the right. The blocks TA3 power station fire box\\, TA3 boiler top\\, TA3 boiler base\\, TA3 turbine\\, TA3 generator and TA3 cooler are required.\n"..
|
||||
"\n"..
|
||||
"The boiler must be filled with water. Fill up to 10 buckets of water in the boiler.\n"..
|
||||
"The fire box must be filled with coal or charcoal.\n"..
|
||||
"When the water is hot\\, the generator can then be started.\n"..
|
||||
"\n"..
|
||||
"Alternatively\\, the power plant can be equipped with an oil burner and then operated with oil.\n"..
|
||||
"The oil can be refilled using a pump and oil pipe.\n"..
|
||||
"\n"..
|
||||
"The power plant delivers an output of 80 ku.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Part of the power plant.\n"..
|
||||
"The fire box must be filled with coal or charcoal. The burning time depends on the power that is requested by the power plant. Coal burns for 20 s and charcoal for 60 s under full load. Correspondingly longer under partial load (50% load = double time).\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Part of the power plant.\n"..
|
||||
"\n"..
|
||||
"The oil burner can be filled with crude oil\\, fuel oil\\, naphtha or gasoline. The burning time depends on the power that is requested by the power plant. Under full load\\, crude oil burns 15 s\\, fuel oil 20 s\\, naphtha 22 s and gasoline 25 s.\n"..
|
||||
"\n"..
|
||||
"Correspondingly longer under partial load (50% load = double time).\n"..
|
||||
"\n"..
|
||||
"The oil burner can only hold 50 units of fuel. An additional oil tank and an oil pump are therefore advisable.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Part of the power plant. Must be filled with water. If there is no more water or the temperature drops too low\\, the power plant switches off.\n"..
|
||||
"\n"..
|
||||
"The water consumption of the TA3 boiler is much lower than that of the steam engine due to the closed steam circuit.\n"..
|
||||
"With the steam engine\\, some water is lost as steam with each piston stroke.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The turbine is part of the power plant. It must be placed next to the generator and connected to the boiler and cooler via steam pipes as shown in the plan.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The generator is used to generate electricity. It must be connected to the machines via power cables and junction boxes.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Used to cool the hot steam from the turbine. Must be connected to the boiler and turbine via steam pipes as shown in the plan.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"In TA3 (and TA4) the machines are powered by electricity. To do this\\, machines\\, storage systems\\, and generators must be connected with power cables.\n"..
|
||||
"TA3 has 2 types of power cables:\n"..
|
||||
"\n"..
|
||||
" - Insulated cables (TA power cables) for local wiring in the floor or in buildings. These cables can be hidden in the wall or in the floor (can be \"plastered\" with the trowel).\n"..
|
||||
" - Overland lines (TA power line) for outdoor cabling over long distances. These cables are protected and cannot be removed by other players.\n"..
|
||||
"\n"..
|
||||
"Several consumers\\, storage systems\\, and generators can be operated together in a power network. Networks can be set up with the help of the junction boxes.\n"..
|
||||
"If too little electricity is provided\\, consumers run out.\n"..
|
||||
"In this context\\, it is also important that the functionality of Forceload blocks is understood\\, because generators\\, for example\\, only supply electricity when the corresponding map block is loaded. This can be enforced with a forceload block.\n"..
|
||||
"\n"..
|
||||
"In TA4 there is also a cable for the solar system.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Storage systems in the power grid fulfill two tasks:\n"..
|
||||
"\n"..
|
||||
" - To cope with peaks in demand: All generators always deliver just as much power as is needed. However\\, if consumers are switched on/off or there are fluctuations in demand for other reasons\\, consumers can fail for a short time. To prevent this\\, there should always be at least one battery block in every network. This serves as a buffer and compensates for these fluctuations in the seconds range.\n"..
|
||||
" - To store regenerative energy: Solar and wind are not available 24 hours a day. So that the power supply does not fail when no electricity is produced\\, one or more storage systems must be installed in the network. Alternatively\\, the gaps can also be bridged with oil/coal electricity.\n"..
|
||||
"\n"..
|
||||
"A storage system indicates its capacity in kud\\, i.e. ku per day. For example\\, a storage system with 100 kud delivers 100 ku for one game day\\, or 10 ku for 10 game days.\n"..
|
||||
"\n"..
|
||||
"All TA3/TA4 energy sources have adjustable charging characteristics. By default this is set to \"80% - 100%\". This means that when the storage system is 80% full\\, the output is reduced further and further until it switches off completely at 100%. If electricity is required in the network\\, 100% will never be reached\\, since the power of the generator has at some point dropped to the electricity demand in the network and the storage system is no longer charged\\, but only the consumers are served.\n"..
|
||||
"\n"..
|
||||
"This has several advantages:\n"..
|
||||
"\n"..
|
||||
" - The charging characteristics are adjustable. This means\\, for example\\, that oil/coal energy sources can be reduced at 60% and regenerative energy sources only at 80%. This means that oil/coal is only burned if there are not enough renewable energy sources available.\n"..
|
||||
" - Several energy sources can be operated in parallel and are loaded almost evenly\\, because all energy sources work\\, for example\\, up to 80% of the storage system's charging capacity at their full capacity and then reduce their capacity at the same time.\n"..
|
||||
" - All storage systems in a network form a large buffer. The charging capacity and the filling level of the entire storage system can always be read in percent on every storage system\\, but also on the electricity terminal.\n"..
|
||||
"\n"..
|
||||
" \n"..
|
||||
"\n",
|
||||
"For local wiring in the floor or in buildings.\n"..
|
||||
"Branches can be realized using junction boxes. The maximum cable length between machines or junction boxes is 1000 m. A maximum of 1000 nodes can be connected in a power network. All blocks with power connection\\, including junction boxes\\, count as nodes.\n"..
|
||||
"\n"..
|
||||
"Since the power cables are not automatically protected\\, the land lines (TA power line) are recommended for longer distances.\n"..
|
||||
"\n"..
|
||||
"Power cables can be plastered with the trowel so they can be hidden in the wall or in the floor. All stone\\, clay and other blocks without \"intelligence\" can be used as plastering material. Dirt does not work because dirt can be converted to grass or the like\\, which would destroy the line.\n"..
|
||||
"\n"..
|
||||
"For plastering\\, the cable must be clicked on with the trowel. The material with which the cable is to be plastered must be on the far left in the player inventory.\n"..
|
||||
"The cables can be made visible again by clicking on the block with the trowel.\n"..
|
||||
"\n"..
|
||||
"In addition to cables\\, the TA junction box and the TA power switch box can also be plastered.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"With the junction box\\, electricity can be distributed in up to 6 directions. Junction boxes can also be plastered (hidden) with a trowel and made visible again.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"With the TA power line and the electricity poles\\, reasonably realistic overhead lines can be realized. The power pole heads also serve to protect the power line (protection). A pole must be set every 16 m or less. The protection only applies to the power line and the poles\\, however\\, all other blocks in this area are not protected.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Used to build electricity poles. Is protected from destruction by the electricity pole head and can only be removed by the owner.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Has up to four arms and thus allows electricity to be distributed in up to 6 directions.\n"..
|
||||
"The electricity pole head protects power lines and poles within a radius of 8 m.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"This electricity pole head has two fixed arms and is used for the overhead lines. However\\, it can also transmit current downwards and upwards.\n"..
|
||||
"The electricity pole head protects power lines and poles within a radius of 8 m.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The switch can be used to switch the power on and off. To do this\\, the switch must be placed on a power switch box. The power switch box must be connected to the power cable on both sides.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The switch can be used to switch the power on and off. To do this\\, the switch must be placed on a power switch box. The power switch box must be connected to the power cable on both sides.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"see TA power switch.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The small power generator runs on gasoline and can be used for small consumers with up to 12 ku. Gasoline burns for 150 s under full load. Correspondingly longer under partial load (50% load = double time).\n"..
|
||||
"\n"..
|
||||
"The power generator can only hold 50 units of gasoline. An additional tank and a pump are therefore advisable.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The battery block is used to store excess energy and automatically delivers power in the event of a power failure (if available).\n"..
|
||||
"Several battery blocks together form a TA3 energy storage system. Each battery block has a display for the charging state and for the stored load.\n"..
|
||||
"The values for the entire network are always displayed here. The stored load is displayed in \"kud\" or \"ku-days\" (analogous to kWh) 5 kud thus corresponds\\, for example\\, to 5 ku for a game day (20 min) or 1 ku for 5 game days.\n"..
|
||||
"\n"..
|
||||
"A battery block has 3.33 kud\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The power terminal must be connected to the power grid. It shows data from the power grid.\n"..
|
||||
"\n"..
|
||||
"The most important figures are displayed in the upper half:\n"..
|
||||
"\n"..
|
||||
" - current/maximum generator power\n"..
|
||||
" - current power consumption of all consumers\n"..
|
||||
" - current charging current in/from the storage system\n"..
|
||||
" - Current state of charge of the storage system in percent\n"..
|
||||
"\n"..
|
||||
"The number of network blocks is output in the lower half.\n"..
|
||||
"\n"..
|
||||
"Additional data on the generators and storage systems can be queried via the \"console\" tab.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The TA3 Electric Motor is required in order to be able to operate TA2 machines via the power grid. The TA3 Electric Motor converts electricity into axle power.\n"..
|
||||
"If the electric motor is not supplied with sufficient power\\, it goes into an fault state and must be reactivated with a right-click.\n"..
|
||||
"\n"..
|
||||
"The electric motor takes max. 40 ku of electricity and provides on the other side max. 39 ku as axle power. So he consumes one ku for the conversion.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The TA3 industrial furnace serves as a supplement to normal furnaces. This means that all goods can be produced with \"cooking\" recipes\\, even in an industrial furnace. But there are also special recipes that can only be made in an industrial furnace.\n"..
|
||||
"The industrial furnace has its own menu for recipe selection. Depending on the goods in the industrial furnace inventory on the left\\, the output product can be selected on the right.\n"..
|
||||
"\n"..
|
||||
"The industrial furnace requires electricity (for the booster) and fuel oil / gasoline for the burner. The industrial furnace must be assembled as shown in the plan on the right.\n"..
|
||||
"\n"..
|
||||
"See also TA4 heater.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Is part of the TA3 industrial furnace.\n"..
|
||||
"\n"..
|
||||
"The oil burner can be operated with crude oil\\, fuel oil\\, naphtha or gasoline. The burning time is 64 s for crude oil\\, 80 s for fuel oil\\, 90 s for naphtha and 100 s for gasoline.\n"..
|
||||
"\n"..
|
||||
"The oil burner can only hold 50 units of fuel. An additional tank and a pump are therefore advisable.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Is part of the TA3 industrial furnace. See TA3 industrial furnace.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Is part of the TA3 industrial furnace. See TA3 industrial furnace.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Liquids such as water or oil can only be pumped through the special pipes and stored in tanks. As with water\\, there are containers (canisters\\, barrels) in which the liquid can be stored and transported.\n"..
|
||||
"\n"..
|
||||
"It is also possible to connect several tanks using the yellow pipes and connectors. However\\, the tanks must have the same content and there must always be at least one yellow pipe between the tank\\, pump and distributor pipe.\n"..
|
||||
"\n"..
|
||||
"E.g. It is not possible to connect two tanks directly to a distributor pipe.\n"..
|
||||
"\n"..
|
||||
"The liquid filler is used to transfer liquids from containers to tanks. The plan shows how canisters or barrels with liquids are pushed into a liquid filler via pushers. The container is emptied in the liquid filler and the liquid is led down into the tank.\n"..
|
||||
"\n"..
|
||||
"The liquid filler can also be placed under a tank to empty the tank.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Liquids can be stored in a tank. A tank can be filled or emptied using a pump. To do this\\, the pump must be connected to the tank via a pipe (yellow pipes).\n"..
|
||||
"\n"..
|
||||
"A tank can also be filled or emptied manually by clicking on the tank with a full or empty liquid container (barrel\\, canister). It should be noted that barrels can only be completely filled or emptied. If\\, for example\\, there are less than 10 units in the tank\\, this remainder must be removed with canisters or pumped empty.\n"..
|
||||
"\n"..
|
||||
"A TA3 tank can hold 1000 units or 100 barrels of liquid.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The pump can be used to pump liquids from tanks or containers to other tanks or containers. The pump direction (arrow) must be observed for the pump. The yellow lines and connectors also make it possible to arrange several tanks on each side of the pump. However\\, the tanks must have the same content.\n"..
|
||||
"\n"..
|
||||
"The TA3 pump pumps 4 units of liquid every two seconds.\n"..
|
||||
"\n"..
|
||||
"Note 1: The pump must not be placed directly next to the tank. There must always be at least a piece of yellow pipe between them.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The liquid filler is used to transfer liquids between containers and tanks.\n"..
|
||||
"\n"..
|
||||
" - If the liquid filler is placed under a tank and empty barrels are put into the liquid filler with a pusher or by hand\\, the contents of the tank are transferred to the barrels and the barrels can be removed from the outlet\n"..
|
||||
" - If the liquid filler is placed on a tank and if full containers are put into the liquid filler with a pusher or by hand\\, the content is transferred to the tank and the empty containers can be removed on the exit side\n"..
|
||||
"\n"..
|
||||
"It should be noted that barrels can only be completely filled or emptied. If\\, for example\\, there are less than 10 units in the tank\\, this remainder must be removed with canisters or pumped empty.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The yellow pipes are used for the transmission of gas and liquids.\n"..
|
||||
"The maximum pipe length is 100 m.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The blocks serve as wall openings for tubes\\, so that no holes remain open.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"There is a valve for the yellow pipes\\, which can be opened and closed with a click of the mouse.\n"..
|
||||
"The valve can also be controlled via on/off commands.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"In order to run your generators and stoves with oil\\, you must first look for oil and build a derrick and then extract the oil.\n"..
|
||||
"TA3 oil explorer\\, TA3 oil drilling box and TA3 pump jack are used for this.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"You can search for oil with the oil explorer. To do this\\, place the block on the floor and right-click to start the search. The oil explorer can be used above ground and underground at all depths.\n"..
|
||||
"The chat output shows you the depth to which oil was searched and how much oil (petroleum) was found.\n"..
|
||||
"You can click the block multiple times to search for oil in deeper areas. Oil fields range in size from 4\\,000 to 20\\,000 items.\n"..
|
||||
"\n"..
|
||||
"If the search was unsuccessful\\, you have to move the block approx. 16 m further.\n"..
|
||||
"The oil explorer always searches for oil in the whole map block and below\\, in which it was set. A new search in the same map block (16x16 field) therefore makes no sense.\n"..
|
||||
"\n"..
|
||||
"If oil is found\\, the location for the derrick is displayed. You have to erect the derrick within the area shown\\, it is best to mark the spot with a sign and protect the entire area against foreign players.\n"..
|
||||
"\n"..
|
||||
"Don't give up looking for oil too quickly. If you're unlucky\\, it can take a long time to find an oil well.\n"..
|
||||
"It also makes no sense to search an area that another player has already searched. The chance of finding oil anywhere is the same for all players.\n"..
|
||||
"\n"..
|
||||
"The oil explorer can always be used to search for oil.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The oil drill box must be placed in the position indicated by the oil explorer. Drilling for oil elsewhere is pointless.\n"..
|
||||
"If the button on the oil drilling box is clicked\\, the derrick is erected above the box. This takes a few seconds.\n"..
|
||||
"The oil drilling box has 4 sides\\, at IN the drill pipe has to be delivered via pusher and at OUT the drilling material has to be removed. The oil drilling box must be supplied with power via one of the other two sides.\n"..
|
||||
"\n"..
|
||||
"The oil drilling box drills to the oil field (1 meter in 16 s) and requires 16 ku of electricity.\n"..
|
||||
"Once the oil field has been reached\\, the derrick can be dismantled and the box removed.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The oil pump (pump-jack) must now be placed in the place of the oil drilling box. The oil pump also requires electricity (16 ku) and supplies one unit of oil every 8 s. The oil must be collected in a tank. To do this\\, the oil pump must be connected to the tank via yellow pipes.\n"..
|
||||
"Once all the oil has been pumped out\\, the oil pump can also be removed.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The drill pipe is required for drilling. As many drill pipe items are required as the depth specified for the oil field. The drill pipe is useless after drilling\\, but it also cannot be dismantled and remains in the ground. However\\, there is a tool to remove the drill pipe blocks (-> Tools -> TA3 drill pipe pliers).\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The oil tank is the large version of the TA3 tank (see liquids -> TA3 tank).\n"..
|
||||
"\n"..
|
||||
"The large tank can hold 4000 units of oil\\, but also any other type of liquid.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"",
|
||||
"Tank carts can be used to transport oil from the oil well to the oil processing plant. A tank cart can be filled or emptied directly using pumps. In both cases\\, the yellow pipes must be connected to the tank cart from above.\n"..
|
||||
"\n"..
|
||||
"The following steps are necessary:\n"..
|
||||
"\n"..
|
||||
" - Place the tank cart in front of the rail bumper block. The bumper block must not yet be programmed with a time so that the tank cart does not start automatically\n"..
|
||||
" - Connect the tank cart to the pump using yellow pipes\n"..
|
||||
" - Switch on the pump\n"..
|
||||
" - Program the bumper with a time (10 - 20 s)\n"..
|
||||
"\n"..
|
||||
"This sequence must be observed on both sides (fill / empty).\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Canisters and barrels can be loaded into the Minecarts. To do this\\, the oil must first be transferred to barrels. The oil barrels can be pushed directly into the Minecart with a pusher and tubes (see map). The empty barrels\\, which come back from the unloading station by Minecart\\, can be unloaded using a hopper\\, which is placed under the rail at the stop.\n"..
|
||||
"\n"..
|
||||
"It is not possible with the hopper to both *unload the empty barrels and load the full barrels at a stop*. The hopper immediately unloads the full barrels. It is therefore advisable to set up 2 stations on the loading and unloading side and then program the Minecart accordingly using a recording run.\n"..
|
||||
"\n"..
|
||||
"The plan shows how the oil can be pumped into a tank and filled into barrels via a liquid filler and loaded into Minecarts.\n"..
|
||||
"\n"..
|
||||
"For the Minecarts to start again automatically\\, the bumper blocks must be configured with the station name and waiting time. 5 s are sufficient for unloading. However\\, since the pushers always go into standby for several seconds when there is no Minecart\\, a time of 15 or more seconds must be entered for loading.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The tank truck is used to transport liquids. Like tanks\\, it can be filled with pumps or emptied. In both cases\\, the yellow tube must be connected to the tank truck from above.\n"..
|
||||
"\n"..
|
||||
"200 units fit in the tank truck.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The chest cart is used to transport items. Like chests\\, it can be filled or emptied using a pusher.\n"..
|
||||
"\n"..
|
||||
"4 stacks fit in the chest cart.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Oil is a mixture of substances and consists of many components. The oil can be broken down into its main components such as bitumen\\, fuel oil\\, naphtha\\, gasoline and propane gas via a distillation tower.\n"..
|
||||
"Further processing to end products takes place in the chemical reactor.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The distillation tower must be set up as in the plan at the top right.\n"..
|
||||
"The bitumen is drained off via the base block. The exit is on the back of the base block (note the direction of the arrow).\n"..
|
||||
"The \"distillation tower\" blocks with the numbers: 1\\, 2\\, 3\\, 2\\, 3\\, 2\\, 3\\, 4 are placed on this basic block\n"..
|
||||
"Fuel oil\\, naphtha and gasoline are drained from the openings from bottom to top. The propane gas is caught at the top.\n"..
|
||||
"All openings on the tower must be connected to tanks.\n"..
|
||||
"The reboiler must be connected to the \"distillation tower 1\" block.\n"..
|
||||
"\n"..
|
||||
"The reboiler needs electricity (not shown in the plan)!\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The reboiler heats the oil to approx. 400 ° C. It largely evaporates and is fed into the distillation tower for cooling.\n"..
|
||||
"\n"..
|
||||
"The reboiler requires 14 units of electricity and produces one unit of bitumen\\, fuel oil\\, naphtha\\, gasoline and propane every 16 s.\n"..
|
||||
"To do this\\, the reboiler must be supplied with oil via a pump.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"In addition to the tubes for goods transport\\, as well as the gas and power pipes\\, there is also a wireless communication level through which blocks can exchange data with each other. No lines have to be drawn for this\\, the connection between transmitter and receiver is only made via the block number. All blocks that can participate in this communication show the block number as info text if you fix the block with the mouse cursor.\n"..
|
||||
"Which commands a block supports can be read out and displayed with the TechAge Info Tool (wrench).\n"..
|
||||
"The simplest commands supported by almost all blocks are:\n"..
|
||||
"\n"..
|
||||
" - 'on' - to turn on block / machine / lamp\n"..
|
||||
" - 'off' - to turn off the block / machine / lamp\n"..
|
||||
"\n"..
|
||||
"With the help of the TA3 Terminal\\, these commands can be tried out very easily. Suppose a signal lamp is number 123.\n"..
|
||||
"Then with:\n"..
|
||||
"\n"..
|
||||
" cmd 123 on\n"..
|
||||
"\n"..
|
||||
"the lamp can be turned on and with:\n"..
|
||||
"\n"..
|
||||
" cmd 123 off\n"..
|
||||
"\n"..
|
||||
"the lamp can be turned off again. These commands must be entered in the input field of the TA3 terminal.\n"..
|
||||
"\n"..
|
||||
"Commands such as 'on' and'off' are sent to the recipient without a response coming back. These commands can therefore be sent to several receivers at the same time\\, for example with a push button / switch\\, if several numbers are entered in the input field.\n"..
|
||||
"\n"..
|
||||
"A command like 'state' requests the status of a block. The block then sends its status back. This type of confirmed command can only be sent to one recipient at a time.\n"..
|
||||
"This command can also be tested with the TA3 terminal on a pusher\\, for example:\n"..
|
||||
"\n"..
|
||||
" cmd 123 state\n"..
|
||||
"\n"..
|
||||
"Possible responses from the pusher are:\n"..
|
||||
"\n"..
|
||||
" - 'running' -> I'm working\n"..
|
||||
" - 'stopped' -> switched off\n"..
|
||||
" - 'standby' -> nothing to do because source inventory is empty\n"..
|
||||
" - 'blocked' -> can't do anything because target inventory is full\n"..
|
||||
"\n"..
|
||||
"This status and other information is also output when the wrench is clicked on the block.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The button/switch sends 'on' / 'off' commands to the blocks that have been configured via the numbers.\n"..
|
||||
"The button/switch can be configured as a button or a switch. If it is configured as a button\\, the time between the 'on' and 'off' commands can be set. With the operating mode \"on button\" only an 'on' and no 'off' command is sent.\n"..
|
||||
"\n"..
|
||||
"The checkbox \"public\" can be used to set whether the button can be used by everyone (set) or only by the owner himself (not set).\n"..
|
||||
"\n"..
|
||||
"Note: With the programmer\\, block numbers can be easily collected and configured.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"With the TA3 command converter\\, 'on' / 'off' commands can be converted into other commands\\, and forwarding can be prevented or delayed.\n"..
|
||||
"The number of the target block or the numbers of the target blocks\\, the commands to be sent and the delay times in seconds must be entered. If no command is entered\\, nothing is sent.\n"..
|
||||
"\n"..
|
||||
"The numbers can also be programmed using the Techage programmer.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The TA3 flip-flop changes its state with each received 'on' command. Received 'off' commands are ignored. Depending on the status change\\, 'on' / 'off' commands are sent alternately. The number of the target block or the numbers of the target blocks must be entered. The numbers can also be programmed using the Techage programmer.\n"..
|
||||
"\n"..
|
||||
"For example\\, lamps can be switched on and off with the help of buttons.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The TA3 logic block can be programmed in such a way that one or more input commands are linked to one output command and sent. This block can therefore replace various logic elements such as AND\\, OR\\, NOT\\, XOR etc. \n"..
|
||||
"Input commands for the logic block are 'on' /'off' commands.\n"..
|
||||
"Input commands are referenced via the number\\, e.g. '1234' for the command from the sender with the number 1234. \n"..
|
||||
"The same applies to output commands.\n"..
|
||||
"\n"..
|
||||
"A rule is structured as follows: \n"..
|
||||
"\n"..
|
||||
" <output> = on/off if <input-expression> is true\n"..
|
||||
"\n"..
|
||||
"'<output>' is the block number to which the command should be sent.\n"..
|
||||
"'<input-expression>' is a boolean expression where input numbers are evaluated.\n"..
|
||||
"\n"..
|
||||
"*Examples for the input expression*\n"..
|
||||
"\n"..
|
||||
"Negate signal (NOT):\n"..
|
||||
"\n"..
|
||||
" 1234 == off\n"..
|
||||
"\n"..
|
||||
"Logical AND:\n"..
|
||||
"\n"..
|
||||
" 1234 == on and 2345 == on\n"..
|
||||
"\n"..
|
||||
"Logical OR:\n"..
|
||||
"\n"..
|
||||
" 1234 == on or 2345 == on\n"..
|
||||
"\n"..
|
||||
"The following operators are allowed: 'and' 'or' 'on' 'off' 'me' '==' '~=' '(' ')'\n"..
|
||||
"\n"..
|
||||
"If the expression is true\\, a command is sent to the block with the '<output>' number. \n"..
|
||||
"Up to four rules can be defined\\, whereby all rules are always checked when a command is received. \n"..
|
||||
"The internal processing time for all commands is 100 ms. \n"..
|
||||
"\n"..
|
||||
"Your own node number can be referenced using the keyword 'me'. This makes it possible for the block to send itself a command (flip-flop function). \n"..
|
||||
"\n"..
|
||||
"The blocking time defines a pause after a command\\, during which the logic block does not accept any further external commands. Commands received during the blocking period are thus discarded. The blocking time can be defined in seconds. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The repeater sends the received signal to all configured numbers.\n"..
|
||||
"This can make sense\\, for example\\, if you want to control many blocks at the same time. The repeater can be configured with the programmer\\, which is not possible with all blocks.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The sequencer can send a series of 'on' / 'off' commands\\, whereby the interval between the commands must be specified in seconds. You can use it to make a lamp blink\\, for example.\n"..
|
||||
"Up to 8 commands can be configured\\, each with target block number and pending the next command.\n"..
|
||||
"The sequencer repeats the commands endlessly when \"Run endless\" is set.\n"..
|
||||
"If nothing is selected\\, only the specified time in seconds is waited for.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The timer can send commands time-controlled. The time\\, the target number(s) and the command itself can be specified for each command line. This means that lamps can be switched on in the evening and switched off again in the morning.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The terminal is primarily used to test the command interface of other blocks (see \"Logic / switching blocks\").\n"..
|
||||
"You can also assign commands to keys and use the terminal productively.\n"..
|
||||
"\n"..
|
||||
" set <button-num> <button-text> <command>\n"..
|
||||
"\n"..
|
||||
"With 'set 1 ON cmd 123 on'\\, for example\\, user key 1 can be programmed with the command 'cmd 123 on'. If the key is pressed\\, the command is sent and the response is output on the screen.\n"..
|
||||
"\n"..
|
||||
"The terminal has the following local commands:\n"..
|
||||
"\n"..
|
||||
" - 'clear' clear screen\n"..
|
||||
" - 'help' output a help page\n"..
|
||||
" - 'pub' switch to public mode\n"..
|
||||
" - 'priv' switch to private mode\n"..
|
||||
"\n"..
|
||||
"In private mode\\, the terminal can only be used by players who can build at this location\\, i.e. who have protection rights.\n"..
|
||||
"\n"..
|
||||
"In public mode\\, all players can use the preconfigured keys.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The signal lamp can be switched on or off with the 'on' / 'off' command. This lamp does not need electricity and can be colored with the airbrush tool from the mod Unified Dyes\" and via Lua/Beduino commands.\n"..
|
||||
"\n"..
|
||||
"With the chat command '/ta_color' the color palette with the values for the Lua/Beduino commands is displayed and with '/ta_send color <num>' the color can be changed.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"With these blocks you can realize doors and gates that can be opened via commands (blocks disappear) and closed again. One door controller is required for each gate or door.\n"..
|
||||
"\n"..
|
||||
"The appearance of the blocks can be adjusted via the block menu.\n"..
|
||||
"This makes it possible to realize secret doors that only open for certain players (with the help of the player detector).\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The door controller is used to control the TA3 door/gate blocks. With the door controller\\, the numbers of the door/gate blocks must be entered. If an 'on' / 'off' command is sent to the door controller\\, this opens/closes the door or gate.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Door Controller II can remove and set all types of blocks. To teach in the Door Controller II\\, the \"Record\" button must be pressed. Then all blocks that should be part of the door / gate must be clicked. Then the \"Done\" button must be pressed. Up to 16 blocks can be selected. The removed blocks are saved in the controller's inventory. The function of the controller can be tested manually using the \"Remove\" or \"Set\" buttons. If an 'on' /'off' command is sent to the Door Controller II\\, it removes or sets the blocks as well.\n"..
|
||||
"\n"..
|
||||
"With '$send_cmnd(node_number\\, \"exchange\"\\, 2)' individual blocks can be set\\, removed or replaced by other blocks from the inventory. \n"..
|
||||
"\n"..
|
||||
"With '$send_cmnd(node_number\\, \"set\"\\, 2)' a block from the inventory can be set explicitly\\, as long as the inventory slot is not empty.\n"..
|
||||
"\n"..
|
||||
"A block can be removed again with '$send_cmnd(node_number\\, \"dig\"\\, 2)' if the inventory slot is empty. \n"..
|
||||
"\n"..
|
||||
"The name of the set block is returned with '$send_cmnd(node_number\\, \"get\"\\, 2)'.\n"..
|
||||
"\n"..
|
||||
"The slot number of the inventory (1 .. 16) must be passed as payload in all three cases.\n"..
|
||||
"\n"..
|
||||
"This can also be used to simulate extendable stairs and the like. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Different sounds can be played with the sound block. All sounds of the Mods Techage\\, Signs Bot\\, Hyperloop\\, Unified Inventory\\, TA4 Jetpack and Minetest Game are available.\n"..
|
||||
"\n"..
|
||||
"The sounds can be selected and played via the menu and via command.\n"..
|
||||
"\n"..
|
||||
" - Command 'on' to play a sound\n"..
|
||||
" - Command 'sound <idx>' to select a sound via the index\n"..
|
||||
" - Command 'gain <volume>' to adjust the volume via the '<volume>' value (1 to 5).\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Mesecons converter is used to convert Techage on/off commands into Mesecons signals and vice versa.\n"..
|
||||
"To do this\\, one or more node numbers must be entered and the converter with Mesecons blocks\n"..
|
||||
"has to be connected via Mesecons cables. The Mesecons converter can also be configured with the programmer.\n"..
|
||||
"The Mesecons converter accepts up to 5 commands per second\\; it switches itself off at higher loads.\n"..
|
||||
"\n"..
|
||||
"*This node only exists if the mod mesecons is active!*\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Detectors scan their surroundings and send an 'on' command when the search is recognized.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The detector is a special tube block that detects when items are passed on through the tube. To do this\\, it must be connected to tubes on both sides. If items are pushed into the detector with a pusher\\, they are automatically passed on.\n"..
|
||||
"It sends an 'on' when an item is recognized\\, followed by an 'off' a second later.\n"..
|
||||
"Then further commands are blocked for 8 seconds.\n"..
|
||||
"The waiting time and the items that should trigger a command can be configured using the open-ended wrench menu. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The cart detector sends an 'on' command if it has recognized a cart (Minecart) directly in front of it. In addition\\, the detector can also restart the cart when an 'on' command is received.\n"..
|
||||
"\n"..
|
||||
"The detector can also be programmed with its own number. In this case\\, he pushes all the wagons that stop near him (one block in all directions).\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The node detector sends an 'on' command if it detects that nodes (blocks) appear or disappear in front of it\\, but must be configured accordingly. After switching the detector back to the standard state (gray block)\\, an 'off' command is sent. Valid blocks are all types of blocks and plants\\, but not animals or players. The sensor range is 3 blocks / meter in the direction of the arrow.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The player detector sends an 'on' command if it detects a player within 4 m of the block. If the player leaves the area again\\, an 'off' command is sent.\n"..
|
||||
"If the search should be limited to specific players\\, these player names can also be entered.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The light detector sends an 'on' command if the light level of the block above exceeds a certain level\\, which can be set through the right-click menu.\n"..
|
||||
"If you have a TA4 Lua Controller\\, you can get the exact light level with $get_cmd(num\\, 'light_level')\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"TA3 has the same machines as TA2\\, only these are more powerful and require electricity instead of axis drive.\n"..
|
||||
"Therefore\\, only the different technical data are given below.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The function corresponds to that of TA2.\n"..
|
||||
"The processing power is 6 items every 2 s.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The function of the TA3 distributor corresponds to that of TA2.\n"..
|
||||
"The processing power is 12 items every 4 s.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The function corresponds to that of TA2.\n"..
|
||||
"The processing power is 2 items every 4 s. The autocrafter requires 6 ku of electricity.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The function corresponds to that of TA2\\, only TA4 WLAN chips are produced here.\n"..
|
||||
"The processing power is one chip every 6 s. The block requires 12 ku of electricity for this.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The function corresponds to that of TA2.\n"..
|
||||
"The maximum depth is 40 meters. The quarry requires 12 ku of electricity.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The function corresponds to that of TA2.\n"..
|
||||
"The processing power is 2 items every 4 s. The block requires 4 ku of electricity.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The function corresponds to that of TA2.\n"..
|
||||
"The probability is also the same as for TA2. The block also requires 3 ku of electricity.\n"..
|
||||
"But in contrast to TA2\\, the status of the TA3 block can be read (controller)\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The function corresponds to that of TA2.\n"..
|
||||
"The processing power is 2 items every 4 s. The block requires 6 ku of electricity.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The injector is a TA3 pusher with special properties. It has a menu for configuration. Up to 8 items can be configured here. He only takes these items from a chest to pass them on to machines with recipes (autocrafter\\, industrial furnace and electronic fab).\n"..
|
||||
"\n"..
|
||||
"When passing on\\, only one position in the inventory is used in the target machine. If\\, for example\\, only the first three entries are configured in the injector\\, only the first three storage locations in the machine's inventory are used. So that an overflow in the machine inventory is prevented.\n"..
|
||||
"\n"..
|
||||
"The injector can also be switched to \"pull mode\". Then he only pulls items out of the chest from the positions that are defined in the configuration of the injector. In this case\\, item type and position must match. This allows to empty specific inventory entries of a chest. \n"..
|
||||
"\n"..
|
||||
"The processing power is up to 8 times one item every 4 seconds.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"",
|
||||
"The Techage Info Tool (open-ended wrench) has several functions. It shows the time\\, position\\, temperature and biome when an unknown block is clicked on.\n"..
|
||||
"If you click on a TechAge block with command interface\\, all available data will be shown (see also \"Logic / switching blocks\").\n"..
|
||||
"\n"..
|
||||
"With Shift + right click an extended menu can be opened for some blocks. Depending on the block\\, further data can be called up or special settings can be made here. In the case of a generator\\, for example\\, the charging curve/switch-off can be programmed. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"With the programmer\\, block numbers can be collected from several blocks with a right click and written into a block like a button / switch with a left click.\n"..
|
||||
"If you click in the air\\, the internal memory is deleted.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The trowel is used for plastering power cables. See also \"TA power cable\".\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"This tool can be used to remove the drill pipe blocks if\\, for example\\, a tunnel is to pass through there.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Techage Screwdriver serves as a replacement for the normal screwdriver. It has the following functions:\n"..
|
||||
"\n"..
|
||||
" - Left click: turn the block to the left\n"..
|
||||
" - Right click: turn the visible side of the block upwards\n"..
|
||||
" - Shift + left click: save the alignment of the clicked block\n"..
|
||||
" - Shift + right click: apply the saved alignment to the clicked block\n"..
|
||||
"\n"..
|
||||
" \n"..
|
||||
"\n",
|
||||
},
|
||||
images = {
|
||||
"techage_ta3",
|
||||
"",
|
||||
"ta3_firebox",
|
||||
"ta3_oilbox",
|
||||
"ta3_boiler",
|
||||
"ta3_turbine",
|
||||
"ta3_generator",
|
||||
"ta3_cooler",
|
||||
"ta3_powerswitch",
|
||||
"power_reduction",
|
||||
"ta3_powercable",
|
||||
"ta3_powerjunction",
|
||||
"ta3_powerline",
|
||||
"ta3_powerpole",
|
||||
"ta3_powerpole4",
|
||||
"ta3_powerpole2",
|
||||
"ta3_powerswitch",
|
||||
"ta3_powerswitchsmall",
|
||||
"ta3_powerswitchbox",
|
||||
"ta3_tinygenerator",
|
||||
"ta3_akkublock",
|
||||
"ta3_powerterminal",
|
||||
"ta3_motor",
|
||||
"",
|
||||
"ta3_furnacefirebox",
|
||||
"ta3_furnace",
|
||||
"ta3_booster",
|
||||
"",
|
||||
"ta3_tank",
|
||||
"ta3_pump",
|
||||
"ta3_filler",
|
||||
"ta3_pipe",
|
||||
"ta3_pipe_wall_entry",
|
||||
"ta3_valve",
|
||||
"techage_ta3",
|
||||
"ta3_oilexplorer",
|
||||
"ta3_drillbox",
|
||||
"ta3_pumpjack",
|
||||
"ta3_drillbit",
|
||||
"oiltank",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"techage_ta31",
|
||||
"",
|
||||
"reboiler",
|
||||
"ta3_logic",
|
||||
"ta3_button",
|
||||
"ta3_command_converter",
|
||||
"ta3_flipflop",
|
||||
"ta3_logic",
|
||||
"ta3_repeater",
|
||||
"ta3_sequencer",
|
||||
"ta3_timer",
|
||||
"ta3_terminal",
|
||||
"ta3_colorlamp",
|
||||
"ta3_doorblock",
|
||||
"ta3_doorcontroller",
|
||||
"ta3_doorcontroller",
|
||||
"ta3_soundblock",
|
||||
"ta3_mesecons_converter",
|
||||
"ta3_nodedetector",
|
||||
"ta3_detector",
|
||||
"ta3_cartdetector",
|
||||
"ta3_nodedetector",
|
||||
"ta3_playerdetector",
|
||||
"ta3_lightdetector",
|
||||
"ta3_grinder",
|
||||
"ta3_pusher",
|
||||
"ta3_distributor",
|
||||
"ta3_autocrafter",
|
||||
"ta3_electronicfab",
|
||||
"ta3_quarry",
|
||||
"ta3_gravelsieve",
|
||||
"ta3_gravelrinser",
|
||||
"ta3_grinder",
|
||||
"ta3_injector",
|
||||
"",
|
||||
"ta3_end_wrench",
|
||||
"ta3_programmer",
|
||||
"ta3_trowel",
|
||||
"ta3_drill_pipe_wrench",
|
||||
"ta3_screwdriver",
|
||||
},
|
||||
plans = {
|
||||
"",
|
||||
"coalpowerstation",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta3_furnace",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta3_tank",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta3_loading",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta3_distiller",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
}
|
||||
}
|
1044
techage/doc/manual_ta4_DE.lua
Normal file
1043
techage/doc/manual_ta4_EN.lua
Normal file
219
techage/doc/manual_ta5_DE.lua
Normal file
@ -0,0 +1,219 @@
|
||||
return {
|
||||
titles = {
|
||||
"1,TA5: Zukunft",
|
||||
"2,Energiequellen",
|
||||
"3,TA5 Fusionsreaktor",
|
||||
"4,TA5 Fusionreaktor Magnet",
|
||||
"4,TA5 Pumpe",
|
||||
"4,TA5 Wärmetauscher",
|
||||
"4,TA5 Fusionreaktor Controller",
|
||||
"4,TA5 Fusionreaktor Hülle",
|
||||
"4,TA5 Fusionreaktor Kern",
|
||||
"2,Energiespeicher",
|
||||
"3,TA5 Hybrid-Speicher (geplant)",
|
||||
"2,Logik Blöcke",
|
||||
"2,Transport und Verkehr",
|
||||
"3,TA5 Flug Controller",
|
||||
"3,TA5 Hyperloop Kiste / TA5 Hyperloop Chest",
|
||||
"3,TA5 Hyperloop Tank / TA5 Hyperloop Tank",
|
||||
"3,TA5-Raumgleiter (geplant)",
|
||||
"2,Teleport Blöcke",
|
||||
"3,TA5 Teleport Block Gegenstände / TA5 Teleport Block Items",
|
||||
"3,TA5 Teleport Block Flüssigkeiten / TA5 Teleport Block Liquids",
|
||||
"3,Hyperloop Teleport Blöcke (geplant)",
|
||||
"2,Weitere TA5 Blöcke/Items",
|
||||
"3,TA5 Container (geplant)",
|
||||
"3,TA5 KI Chip / TA5 AI Chip",
|
||||
"3,TA5 KI Chip II / TA5 AI Chip II",
|
||||
},
|
||||
texts = {
|
||||
"Maschinen zur Überwindung von Raum und Zeit\\, neue Energiequellen und andere Errungenschaften prägen dein Leben. \n"..
|
||||
"\n"..
|
||||
"Für die Herstellung und Nutzung von TA5 Maschinen und Blöcken sind Erfahrungspunkte (experience points) notwendig. Diese können nur über den Teilchenbeschleuniger aus TA4 erarbeitet werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"",
|
||||
"Kernfusion bedeutet das Verschmelzen zweier Atomkerne. Dabei können\\, je nach Reaktion\\, große Mengen von Energie freigesetzt werden. Kernfusionen\\, bei denen Energie frei wird\\, laufen in Form von Kettenreaktionen ab. Sie sind die Quelle der Energie der Sterne\\, zum Beispiel auch unserer Sonne. Ein Fusionsreaktor wandelt die Energie\\, die bei einer kontrollierten Kernfusion frei wird\\, in elektrischen Strom um.\n"..
|
||||
"\n"..
|
||||
"*Wie funktionieren ein Fusionsreaktor?*\n"..
|
||||
"\n"..
|
||||
"Ein Fusionsreaktor funktioniert nach dem klassischen Prinzip eines Wärmekraftwerks: Wasser wird erhitzt und treibt eine Dampfturbine an\\, deren Bewegungsenergie von einem Generator in Strom gewandelt wird.\n"..
|
||||
"\n"..
|
||||
"Ein Fusionskraftwerk benötigt zunächst eine hohe Menge an Energie\\, da ein Plasma erzeugt werden muss. „Plasma“ nennt man den vierten Zustand von Stoffen\\, nach fest\\, flüssig und gasförmig. Dafür wird viel Strom benötigt. Erst durch diese extreme Energiekonzentration zündet die Fusionsreaktion und mit der abgegebenen Wärme wird über den Wärmetauscher Strom erzeugt. Der Generator liefert dann 800 ku an Strom.\n"..
|
||||
"\n"..
|
||||
"Der Plan rechts zeigt einen Schnitt durch den Fusionsreaktor.\n"..
|
||||
"\n"..
|
||||
"Für den Betrieb des Fusionsreaktors werden 60 Erfahrungspunkte benötigt. Der Fusionsreaktur muss komplett in einem Forceload Block Bereich aufgebaut werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Für den Aufbau des Fusionsreaktor werden insgesamt 60 TA5 Fusionreaktor Magnete benötigt. Diese bilden den Ring\\, in dem sich das Plasma bildet. Der TA5 Fusionsreaktor Magnete benötigt Strom und hat zwei Anschlüsse für die Kühlung.\n"..
|
||||
"\n"..
|
||||
"Es gibt zwei Typen von Magneten\\, so dass auch alle Seiten des Magnets\\, die zum Plasmaring zeigen\\, mit einem Hitzeschild geschützt werden können.\n"..
|
||||
"\n"..
|
||||
"Bei den Eckmagneten auf der Innenseite des Rings ist jeweils eine Anschlussseite verdeckt (Strom oder Kühlung) und kann daher nicht angeschlossen werden. Dies ist technisch nicht machbar und hat daher keinen Einfluß auf die Funktion des Fusionsreaktor. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Pumpe wird benötigt\\, um den Kühlkreislauf mit Isobutan zu füllen. Es werden ca. 350 Einheiten Isobutan benötigt.\n"..
|
||||
"\n"..
|
||||
"Hinweis: Die TA5 Pumpe kann nur zum Füllen des Kühlkreislaufs genutzt werden\\, ein Abpumpen des Kühlmittels ist nicht möglich. Daher sollte die Pumpe erst eingeschaltet werden\\, wenn die Magnete korrekt platziert und alle Strom- und Kühlleitungen angeschlossen sind.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der TA5 Wärmetauscher wird benötigt\\, um die im Fusionsreaktor erzeugte Hitze zuerst in Dampf und dann in Strom umzuwandeln. Der Wärmetauscher selbst benötigt dazu 5 ku Strom. Der Aufbau gleicht dem Wärmetauscher des Energiespeichers aus TA4.\n"..
|
||||
"\n"..
|
||||
"Hinweis: Der TA5 Wärmetauscher hat zwei Anschlüsse (blau und grün) für den Kühlkreislauf. Über die grünen und blauen Röhren müssen der Wärmetauscher und alle Magnete zu einem Kühlkreislauf verbunden werden.\n"..
|
||||
"\n"..
|
||||
"Über den Start-Button des Wärmetauschers kann der Kühlkreislauf auf Vollständigkeit geprüft werden\\, auch wenn noch kein Kühlmittel eingefüllt wurde.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Über den TA5 Fusionreaktor Controller wird der Fusionreaktors eingeschaltet. Dabei muss zuerst die Kühlung/Wärmetauscher und dann der Controller eingeschaltet werden. Es dauert ca. 2 min\\, bis der Reaktor in Gang kommt und Strom liefert. Der Fusionreaktor und damit der Controller benötigt 400 ku an Strom\\, um das Plasma aufrecht zu erhalten.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der komplette Reaktor muss mit einer Hülle umgeben werden\\, die den enormen Druck\\, den die Magnete auf das Plasma ausüben\\, abfängt und die Umgebung vor Strahlung schützt. Ohne diese Hülle kann der Reaktor nicht gestartet werden. Mit der TechAge Kelle können auch Stromkabel und Kühlleitungen des Fusionreaktors in die Hülle integriert werden.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der Kern muss in der Mitte des Reaktors sitzen. Siehe Abbildung unter \"TA5 Fusionsreaktor\". Auch hierfür wird die TechAge Kelle benötigt.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"Der TA5 Flug Controller ist ähnlich zum TA4 Move Controller. Im Gegensatz zum TA4 Move Controller können hier mehrere Bewegungen zu einer Flugstrecke kombiniert werden. Diese Flugstrecke kann im Eingabefeld über mehrere x\\,y\\,z Angaben definiert werden (eine Bewegung pro Zeile). Über \"Speichern\" wird die Flugstrecke geprüft und gespeichert. Bei einem Fehler wird eine Fehlermeldung ausgegeben.\n"..
|
||||
"\n"..
|
||||
"Mit der Taste \"Test\" wird die Flugstrecke mit den absoluten Koordinaten zur Überprüfung im Chat ausgegeben.\n"..
|
||||
"\n"..
|
||||
"Die maximale Distanz für die gesammte Flugstrecke beträgt 1500 m. Es können bis zu 32 Blöcke antrainiert werden.\n"..
|
||||
"\n"..
|
||||
"Die Nutzung des TA5 Flug Controllers benötigt 40 Erfahrungspunkte.\n"..
|
||||
"\n"..
|
||||
"*Teleport Mode*\n"..
|
||||
"\n"..
|
||||
"Wird der 'Teleport Mode' aktiviert (auf 'enable' gesetzt)\\, kann ein Spieler auch ohne Blöcke bewegt werden. Dazu muss die Startposition über die Taste \"Aufzeichnen\" konfiguriert werden. Es kann hier nur eine Position konfiguriert werden. Das Spieler\\, der bewegt werden soll\\, muss dazu auf dieser Position stehen. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die TA5 Hyperloop Kiste erlaubt den Transport von Gegenständen über ein Hyperloop Netzwerk.\n"..
|
||||
"\n"..
|
||||
"Die TA5 Hyperloop Kiste muss man dazu auf eine Hyperloop Junction stellen. Die Kiste besitzt ein spezielles Menü\\, mit dem man das Pairing von zwei Kisten durchführen kann. Dinge\\, die in der Kiste sind\\, werden zur Gegenstelle teleportiert. Die Kiste kann auch mit einem Schieber gefüllt/geleert werden.\n"..
|
||||
"\n"..
|
||||
"Für das Pairing musst du zuerst auf der einen Seite einen Namen für die Kiste eingeben\\, dann kannst du bei der anderen Kiste diesen Namen auswählen und so die beiden Blöcke verbinden.\n"..
|
||||
"\n"..
|
||||
"Die Nutzung der TA5 Hyperloop Kiste benötigt 15 Erfahrungspunkte.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der TA5 Hyperloop Tank erlaubt den Transport von Flüssigkeiten über ein Hyperloop Netzwerk.\n"..
|
||||
"\n"..
|
||||
"Den TA5 Hyperloop Tank muss man dazu auf eine Hyperloop Junction stellen. Der Tank besitzt ein spezielles Menü\\, mit dem man das Pairing von zwei Tanks durchführen kann. Flüssigkeiten\\, die in dem Tank sind\\, werden zur Gegenstelle teleportiert. Der Tank kann auch mit einer Pumpe gefüllt/geleert werden.\n"..
|
||||
"\n"..
|
||||
"Für das Pairing musst du zuerst auf der einen Seite einen Namen für den Tank eingeben\\, dann kannst du bei dem anderen Tank diesen Namen auswählen und so die beiden Blöcke verbinden.\n"..
|
||||
"\n"..
|
||||
"Die Nutzung des TA5 Hyperloop Tanks benötigt 15 Erfahrungspunkte.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Dank einem Spezialantrieb für Lichtgeschwindigkeit können mit dem Raumgleiter auch große Entfernungen sehr schnell überwunden werden.\n"..
|
||||
"\n",
|
||||
"Mit Teleport-Blöcken können Dinge zwischen zwei Teleport-Blöcken übertragen werden\\, ohne dass sich dazwischen eine Röhre oder Leitung befinden muss. Für das Pairing der Blöcke musst du zuerst auf der einen Seite einen Namen für den Block eingeben\\, dann kannst du bei dem anderen Block diesen Namen auswählen und so die beiden Blöcke verbinden. Das Pairung kann nur von einem Spieler durchgeführt werden (Spielername wird geprüft) und muss vor einem Server-Neustart abgeschlossen sein. Anderenfalls gehen die Pairing-Daten verloren.\n"..
|
||||
"\n"..
|
||||
"Der Plan rechts zeigt\\, wie die Blöcke genutzt werden können.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Diese Teleport-Blöcke erlauben die Übertragung von Gegenständen und ersetzen somit eine Röhre. Dabei können Entfernungen von bis zu 500 Blöcken überbrückt werden.\n"..
|
||||
"\n"..
|
||||
"Ein Teleport-Block benötigt 12 ku Strom.\n"..
|
||||
"\n"..
|
||||
"Für die Nutzung der Teleport-Blöcke werden 30 Erfahrungspunkte benötigt.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Diese Teleport-Blöcke erlauben die Übertragung von Flüssigkeiten und ersetzen somit eine gelbe Leitung. Dabei können Entfernungen von bis zu 500 Blöcken überbrückt werden.\n"..
|
||||
"\n"..
|
||||
"Ein Teleport-Block benötigt 12 ku Strom.\n"..
|
||||
"\n"..
|
||||
"Für die Nutzung der Teleport-Blöcke werden 30 Erfahrungspunkte benötigt.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Die Hyperloop Teleport Blöcke erlauben den Aufbau von Hyperloop Netzwerk ohne Hyperloop-Röhren.\n"..
|
||||
"\n"..
|
||||
"Die Nutzung der Hyperloop Teleport Blöcke benötigt 60 Erfahrungspunkte.\n"..
|
||||
"\n",
|
||||
"",
|
||||
"Der TA5 Container erlaubt Techage Anlagen ein- und an einer anderen Stelle wieder auszupacken.\n"..
|
||||
"\n"..
|
||||
"Für die Nutzung des TA5 Containers werden 80 Erfahrungspunkte benötigt.\n"..
|
||||
"\n",
|
||||
"Der TA5 KI Chip wird teilweise zur Herstellung von TA5 Blöcken benötigt. Der TA5 KI Chip kann nur auf der TA4 Elektronik Fab hergestellt werden. Dazu werden 10 Erfahrungspunkte benötigt.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Der TA5 KI Chip II wird zur Herstellung des TA5 Fusionsreaktors benötigt. Der TA5 KI Chip II kann nur auf der TA4 Elektronik Fab hergestellt werden. Dazu werden 25 Erfahrungspunkte benötigt.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
},
|
||||
images = {
|
||||
"techage_ta5",
|
||||
"",
|
||||
"",
|
||||
"ta5_magnet",
|
||||
"ta5_pump",
|
||||
"",
|
||||
"ta5_fr_controller",
|
||||
"ta5_fr_shell",
|
||||
"ta5_fr_nucleus",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta5_flycontroller",
|
||||
"ta5_chest",
|
||||
"ta5_tank",
|
||||
"",
|
||||
"",
|
||||
"ta5_tele_tube",
|
||||
"ta5_tele_pipe",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta5_aichip",
|
||||
"ta5_aichip2",
|
||||
},
|
||||
plans = {
|
||||
"",
|
||||
"",
|
||||
"ta5_fusion_reactor",
|
||||
"",
|
||||
"",
|
||||
"ta5_heatexchanger",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta5_teleport",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
}
|
||||
}
|
214
techage/doc/manual_ta5_EN.lua
Normal file
@ -0,0 +1,214 @@
|
||||
return {
|
||||
titles = {
|
||||
"1,TA5: Future",
|
||||
"2,Energy Sources",
|
||||
"3,TA5 Fusion Reactor",
|
||||
"4,TA5 Fusion Reactor Magnet",
|
||||
"4,TA5 Pump",
|
||||
"4,TA5 Heat Exchanger",
|
||||
"4,TA5 Fusion Reactor Controller",
|
||||
"4,TA5 Fusion Reactor Shell",
|
||||
"4,TA5 Fusion Reactor Core",
|
||||
"2,Energy Storage",
|
||||
"3,TA5 Hybrid Storage (planned)",
|
||||
"2,Logic blocks",
|
||||
"2,Transport and Traffic",
|
||||
"3,TA5 Flight Controller",
|
||||
"3,TA5 Hyperloop Chest",
|
||||
"3,TA5 Hyperloop Tank",
|
||||
"2,Teleport Blocks",
|
||||
"3,TA5 Teleport Block Items",
|
||||
"3,TA5 Teleport Block Liquids",
|
||||
"3,Hyperloop Teleport Blocks (planned)",
|
||||
"2,More TA5 Blocks/Items",
|
||||
"3,TA5 Container (planned)",
|
||||
"3,TA5 AI Chip",
|
||||
"3,TA5 AI Chip II",
|
||||
},
|
||||
texts = {
|
||||
"Machines to overcome space and time\\, new sources of energy and other achievements shape your life.\n"..
|
||||
"\n"..
|
||||
"Experience points are required for the manufacture and use of TA5 machines and blocks. These can only be worked out using the collider from TA4.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"",
|
||||
"Nuclear fusion means the fusing of two atomic nuclei. Depending on the reaction\\, large amounts of energy can be released. Nuclear fusions\\, in which energy is released\\, take place in the form of chain reactions. They are the source of the energy of the stars\\, including our sun\\, for example. A fusion reactor converts the energy released during controlled nuclear fusion into electricity.\n"..
|
||||
"\n"..
|
||||
"*How do fusion reactors work?*\n"..
|
||||
"\n"..
|
||||
"A fusion reactor works according to the classic principle of a thermal power plant: water is heated and drives a steam turbine\\, whose kinetic energy is converted into electricity by a generator.\n"..
|
||||
"\n"..
|
||||
"A fusion power plant initially requires a large amount of energy\\, since a plasma has to be generated. \"Plasma\" is the name given to the fourth state of matter\\, after solid\\, liquid and gaseous. This requires a lot of electricity. Only through this extreme concentration of energy does the fusion reaction ignite and the heat given off is used to generate electricity via the heat exchanger. The generator then delivers 800 ku of electricity.\n"..
|
||||
"\n"..
|
||||
"The plan on the right shows a section through the fusion reactor.\n"..
|
||||
"\n"..
|
||||
"60 experience points are required to operate the fusion reactor. The fusion reactor must be built entirely in a forceload block area.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"A total of 60 TA5 Fusion Reactor Magnets are required to set up the fusion reactor. These form the ring in which the plasma forms. The TA5 Fusion Reactor Magnets requires power and has two ports for cooling.\n"..
|
||||
"\n"..
|
||||
"There are two types of magnets\\, so all sides of the magnet that face the plasma ring can also be protected with a heat shield.\n"..
|
||||
"\n"..
|
||||
"With the corner magnets on the inside of the ring\\, one connection side is covered (power or cooling) and can therefore not be connected. This is technically not feasible and therefore has no influence on the function of the fusion reactor. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The pump is required to fill the cooling circuit with isobutane. About 350 units of isobutane are required.\n"..
|
||||
"\n"..
|
||||
"Note: The TA5 pump can only be used to fill the cooling circuit\\, pumping out the coolant is not possible. Therefore\\, the pump should not be switched on until the magnets are correctly placed and all power and cooling lines are connected.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The TA5 Heat Exchanger is required to convert the heat generated in the fusion reactor first to steam and then to electricity. The Heat Exchanger itself requires 5 ku electricity. The structure is similar to the Heat Exchanger of the energy store from TA4.\n"..
|
||||
"\n"..
|
||||
"Note: The TA5 Heat Exchanger has two connections (blue and green) for the cooling circuit. The heat exchanger and all magnets must be connected to form a cooling circuit via the green and blue pipes.\n"..
|
||||
"\n"..
|
||||
"The cooling circuit can be checked for completeness using the start button on the heat exchanger\\, even if no coolant has yet been filled in.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The fusion reactor is switched on via the TA5 Fusion Reactor Controller. The cooling/Heat Exchanger must be switched on first and then the controller. It takes about 2 minutes for the reactor to start up and supply electricity. The fusion reactor and thus the controller requires 400 ku of electricity to maintain the plasma.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The entire reactor must be surrounded by a shell that absorbs the enormous pressure that the magnets exert on the plasma and protects the environment from radiation. Without this shell\\, the reactor cannot be started. With the TechAge Trowel\\, power cables and cooling pipes of the fusion reactor can also be integrated into the shell.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The core must sit in the center of the reactor. See illustration under \"TA5 Fusion Reactor\". The TechAge Trowel is also required for this.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"The TA5 Flight Controller is similar to the TA4 Move Controller. In contrast to the TA4 Move Controller\\, several movements can be combined into one flight route. This flight route can be defined in the input field using several x\\,y\\,z entries (one movement per line). The flight route is checked and saved via \"Save\". In the event of an error\\, an error message is issued.\n"..
|
||||
"\n"..
|
||||
"With the \"Test\" button\\, the flight route with the absolute coordinates is output for checking in the chat.\n"..
|
||||
"\n"..
|
||||
"The maximum distance for the entire flight distance is 1500 m. Up to 32 blocks can be trained.\n"..
|
||||
"\n"..
|
||||
"The use of the TA5 Flight Controller requires 40 experience points.\n"..
|
||||
"\n"..
|
||||
"*Teleport mode*\n"..
|
||||
"\n"..
|
||||
"If the 'Teleport Mode' is enabled\\, a player can also be moved without blocks. To do this\\, the start position must be configured using the \"Record\" button. Only one position can be configured here. The player to be moved must be in that position.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The TA5 Hyperloop Chest allows objects to be transported over a Hyperloop network.\n"..
|
||||
"\n"..
|
||||
"The TA5 Hyperloop Chest has to be placed on a Hyperloop Junction. The chest has a special menu\\, with which you can pair two chests. Things that are in the chest are teleported to the remote station. The chest can also be filled/emptied with a pusher.\n"..
|
||||
"\n"..
|
||||
"For pairing you first have to enter a name for the chest on one side\\, then you can select this name for the other chest and thus connect the two blocks.\n"..
|
||||
"\n"..
|
||||
"The use of the TA5 Hyperloop Chest requires 15 experience points.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The TA5 Hyperloop Tank allows liquids to be transported over a Hyperloop network.\n"..
|
||||
"\n"..
|
||||
"The TA5 Hyperloop Tank has to be placed on a Hyperloop Junction.The tank has a special menu\\, with which you can pair two tanks. Liquids in the tank will be teleported to the remote station. The tank can also be filled/emptied with a pump.\n"..
|
||||
"\n"..
|
||||
"For pairing you first have to enter a name for the tank on one side\\, then you can select this name for the other tank and thus connect the two blocks.\n"..
|
||||
"\n"..
|
||||
"The use of the TA5 Hyperloop Tank requires 15 experience points.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"Teleport blocks allow things to be transferred between two teleport blocks without the need for a pipe or tube in between. To pair the blocks\\, you first have to enter a name for the block on one side\\, then you can select this name for the other block and thus connect the two blocks. Pairing can only be carried out by one player (player name is checked) and must be completed before the server is restarted. Otherwise the pairing data will be lost.\n"..
|
||||
"\n"..
|
||||
"The map on the right shows how the blocks can be used. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"These teleport blocks allow the transfer of items and thus replace a tube. Distances of up to 500 blocks can be bridged.\n"..
|
||||
"\n"..
|
||||
"Each Teleport blocks requires 12 ku of electricity.\n"..
|
||||
"\n"..
|
||||
"30 experience points are required to use the teleport blocks. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"These teleport blocks allow the transfer of liquids and thus replace a pipe. Distances of up to 500 blocks can be bridged.\n"..
|
||||
"\n"..
|
||||
"Each Teleport blocks requires 12 ku of electricity.\n"..
|
||||
"\n"..
|
||||
"30 experience points are required to use the teleport blocks. \n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The Hyperloop Teleport Blocks allow the construction of a Hyperloop network without Hyperloop tubes.\n"..
|
||||
"\n"..
|
||||
"The use of the Hyperloop Teleport Blocks requires 60 experience points.\n"..
|
||||
"\n",
|
||||
"",
|
||||
"The TA5 container allows Techage systems to be packed and unpacked at another location.\n"..
|
||||
"\n"..
|
||||
"80 experience points are required to use the TA5 container.\n"..
|
||||
"\n",
|
||||
"The TA5 AI Chip is partly required for the production of TA5 blocks. The TA5 AI Chip can only be manufactured at the TA4 Electronics Fab. This requires 10 experience points.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
"The TA5 AI Chip II is required to build the TA5 Fusion Reactor. The TA5 AI Chip II can only be manufactured at the TA4 Electronics Fab. This requires 25 experience points.\n"..
|
||||
"\n"..
|
||||
"\n"..
|
||||
"\n",
|
||||
},
|
||||
images = {
|
||||
"techage_ta5",
|
||||
"",
|
||||
"",
|
||||
"ta5_magnet",
|
||||
"ta5_pump",
|
||||
"",
|
||||
"ta5_fr_controller",
|
||||
"ta5_fr_shell",
|
||||
"ta5_fr_nucleus",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta5_flycontroller",
|
||||
"ta5_chest",
|
||||
"ta5_tank",
|
||||
"",
|
||||
"ta5_tele_tube",
|
||||
"ta5_tele_pipe",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta5_aichip",
|
||||
"ta5_aichip2",
|
||||
},
|
||||
plans = {
|
||||
"",
|
||||
"",
|
||||
"ta5_fusion_reactor",
|
||||
"",
|
||||
"",
|
||||
"ta5_heatexchanger",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"ta5_teleport",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
}
|
||||
}
|
@ -12,7 +12,7 @@
|
||||
|
||||
]]--
|
||||
|
||||
techage.ConstructionPlans = {}
|
||||
local plans = {}
|
||||
|
||||
|
||||
local IMG_1 = {"", "techage_ta1.png"}
|
||||
@ -38,7 +38,7 @@ local DDIRT = {"default_dirt.png", "default:dirt"}
|
||||
local DWOOD = {"default_wood.png" , "default:wood"}
|
||||
local LIGTR = {"techage_lighter.png", "techage:lighter"}
|
||||
|
||||
techage.ConstructionPlans["coalpile"] = {
|
||||
plans["coalpile"] = {
|
||||
{false, false, SIDEV, false, false, false, false, false, TOP_V, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false, false},
|
||||
{DDIRT, DDIRT, DDIRT, DDIRT, DDIRT, false, DDIRT, DDIRT, DDIRT, DDIRT, DDIRT},
|
||||
@ -57,7 +57,7 @@ local CCOAL = {"techage_charcoal.png", "techage:charcoal"}
|
||||
local MEPOT = {"default_cobble.png^techage_meltingpot.png", "techage:meltingpot"}
|
||||
local FLAME = {"techage_flame.png", nil}
|
||||
|
||||
techage.ConstructionPlans["coalburner"] = {
|
||||
plans["coalburner"] = {
|
||||
{false, false, SIDEV, false, false, false, false},
|
||||
{false, false, MEPOT, false, false, IMG_1, false},
|
||||
{false, false, FLAME, false},
|
||||
@ -76,7 +76,7 @@ local CHEST = {"default_chest_lock.png", "default:chest_locked"}
|
||||
local HOPPR = {"techage_hopper.png^[transformFX", "minecart:hopper"}
|
||||
local SIEVE = {"techage_sieve_sieve_ta1.png", "techage:sieve3"}
|
||||
|
||||
techage.ConstructionPlans["hoppersieve"] = {
|
||||
plans["hoppersieve"] = {
|
||||
{false, false, false, false, false},
|
||||
{false, false, false, false, false},
|
||||
{false, CHEST, false, false, false},
|
||||
@ -110,7 +110,7 @@ local BEARG = {"default_stone_brick.png^techage_axle_bearing_front.png", "techag
|
||||
local BRICK = {"default_stone_brick.png", "default:stonebrick"}
|
||||
|
||||
|
||||
techage.ConstructionPlans["watermill1"] = {
|
||||
plans["watermill1"] = {
|
||||
{false, false, false, false, false, false, false, false, false, false, false, false},
|
||||
{false, false, SLUC2, false, false, false, false, false, false, false, false, false},
|
||||
{WATR4, WATR4, SLUC1, WMILL, WMILL, WMILL, WMILL, WMILL, WATR3, false, false, false},
|
||||
@ -131,7 +131,7 @@ local MILLB = {"default_stone_brick.png", "techage:ta1_mill_base"}
|
||||
local FURNE = {"default_furnace_front.png", "default:furnace"}
|
||||
local HOPER = {"techage_hopper.png", "minecart:hopper"}
|
||||
|
||||
techage.ConstructionPlans["watermill2"] = {
|
||||
plans["watermill2"] = {
|
||||
{false, false, false, false, false, false, false, false, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false, false, false},
|
||||
@ -157,7 +157,7 @@ local FIBOX = {"techage_firebox.png^techage_appl_firehole.png^techage_frame_ta2.
|
||||
local CYLIN = {"techage_filling_ta2.png^techage_cylinder.png^techage_frame_ta2.png", "techage:cylinder"}
|
||||
local FLYWH = {"techage_filling_ta2.png^techage_frame_ta2.png^techage_flywheel.png^[transformFX]", "techage:flywheel"}
|
||||
|
||||
techage.ConstructionPlans["steamengine"] = {
|
||||
plans["steamengine"] = {
|
||||
{false, false, false, false, false, IMG_2, false},
|
||||
{false, false, false, false, false, false, false},
|
||||
{false, PK000, PI000, PK270, false, false, false},
|
||||
@ -176,7 +176,7 @@ local WINCH = {"techage_filling_ta2.png^techage_appl_winch.png^techage_frame_ta2
|
||||
local ROPE_ = {"techage_rope_inv.png", "techage:ta2_rope"}
|
||||
local WCHST = {"techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_chest_back_ta3.png^techage_weight_side.png", "techage:ta2_weight_chest"}
|
||||
|
||||
techage.ConstructionPlans["ta2_storage"] = {
|
||||
plans["ta2_storage"] = {
|
||||
{false, false, false, GRBOX, WINCH, false, SIDEV},
|
||||
{false, false, false, AXL90, ROPE_, false, false},
|
||||
{false, false, false, AXL90, ROPE_, false, false},
|
||||
@ -198,7 +198,7 @@ local GRIND = {"techage_filling_ta2.png^techage_appl_grinder2.png^techage_frame_
|
||||
local DISTR = {"techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_distri_blue.png", "techage:ta2_distributor_pas"}
|
||||
local SIEV2 = {"techage_filling_ta2.png^techage_appl_sieve.png^techage_frame_ta2.png", "techage:ta2_gravelsieve_pas"}
|
||||
|
||||
techage.ConstructionPlans["itemtransport"] = {
|
||||
plans["itemtransport"] = {
|
||||
{false, false, false, false, false, false, false, false, false, false, false},
|
||||
{false},
|
||||
{false},
|
||||
@ -217,7 +217,7 @@ local TK090 = {"techage_tube_knee.png^[transformR90", "techage:tubeS"} -- '7'
|
||||
local TK180 = {"techage_tube_knee.png^[transformR180", "techage:tubeS"}
|
||||
local TK270 = {"techage_tube_knee.png^[transformR270", "techage:tubeS"}
|
||||
|
||||
techage.ConstructionPlans["gravelrinser"] = {
|
||||
plans["gravelrinser"] = {
|
||||
{false, false, false, SIDEV, false, false, false, false},
|
||||
{false, GLASS, WATER, GLASS, GLASS, GLASS, GLASS, GLASS},
|
||||
{false, DDIRT, DDIRT, TK000, RINSR, TK270, HOPPR, CHEST},
|
||||
@ -239,7 +239,7 @@ local GENE3 = {"techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_gener
|
||||
local COOL3 = {"techage_filling_ta3.png^techage_frame_ta3.png^techage_cooler.png", "techage:cooler"}
|
||||
local PK180 = {"techage_steam_knee.png^[transformR180", "techage:steam_pipeS"}
|
||||
|
||||
techage.ConstructionPlans["coalpowerstation"] = {
|
||||
plans["coalpowerstation"] = {
|
||||
{false, false, false, false, false, false, false, false},
|
||||
{false, PK000, PI000, PI000, PI000, PI000, PI000, PK270},
|
||||
{false, PI090, BOIL3, PI000, PK270, PK000, COOL3, PK180},
|
||||
@ -259,7 +259,7 @@ local Boost = {"techage_filling_ta3.png^techage_appl_compressor.png^[transformFX
|
||||
local Fibox = {"techage_concrete.png^techage_appl_firehole.png^techage_frame_ta3.png", "techage:furnace_firebox"}
|
||||
local Furnc = {"techage_concrete.png^techage_appl_furnace.png^techage_frame_ta3.png", "techage:ta3_furnace_pas"}
|
||||
|
||||
techage.ConstructionPlans["ta3_furnace"] = {
|
||||
plans["ta3_furnace"] = {
|
||||
{false, false, false, false, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false},
|
||||
{false, Tubes, PushR, Tubes, Furnc, Tubes, PushR, Tubes},
|
||||
@ -280,7 +280,7 @@ local PN090 = {"techage_gaspipe_knee.png^[transformR90", "techage:ta4_pipeS"}
|
||||
local PN180 = {"techage_gaspipe_knee.png^[transformR180", "techage:ta4_pipeS"} -- J
|
||||
local PN270 = {"techage_gaspipe_knee.png^[transformR270", "techage:ta4_pipeS"} -- 7
|
||||
|
||||
techage.ConstructionPlans["ta3_tank"] = {
|
||||
plans["ta3_tank"] = {
|
||||
{false, false, false, false, SIDEV, false, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false},
|
||||
{false, Tubes, PushR, Tubes, Fillr, Tubes, PushR, Tubes, false, false},
|
||||
@ -302,7 +302,7 @@ local RAILH = {"carts_rail_straight.png^[transformR90", "carts:rail"}
|
||||
local CRAIL = {"carts_rail_curved.png^[transformR90", "carts:rail"}
|
||||
local BUFFR = {"default_junglewood.png^minecart_buffer.png", "minecart:buffer"}
|
||||
|
||||
techage.ConstructionPlans["ta3_loading"] = {
|
||||
plans["ta3_loading"] = {
|
||||
{false, false, PIPEH, Pump, PIPEH, PN270, SIDEV, false, false, false, false},
|
||||
{false, false, false, false, false, PIPEV, false, false, false, false, false},
|
||||
{false, MCART, false, false, false, PN090, TANK3, false, false, false, false},
|
||||
@ -325,7 +325,7 @@ local DIST1 = {"techage_distiller_inv.png", "techage:ta3_distiller1"}
|
||||
local DBASE = {"techage_concrete.png", "techage:ta3_distiller_base"}
|
||||
local REBIO = {"techage_filling_ta3.png^techage_appl_reboiler.png^techage_frame_ta3.png", "techage:ta3_reboiler"}
|
||||
|
||||
techage.ConstructionPlans["ta3_distiller"] = {
|
||||
plans["ta3_distiller"] = {
|
||||
{false, false, false, false, false, SIDEV, false, PN000, PIPEH, TANK3, false},
|
||||
{false, IMG31, false, false, false, false, false, DIST4, false, false, false},
|
||||
{false, false, false, false, false, false, false, DIST3, PIPEH, TANK3, false},
|
||||
@ -349,7 +349,7 @@ local DOSER = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_pump_
|
||||
local SILO4 = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_silo.png", "techage:ta4_silo"}
|
||||
local TANK4 = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", "techage:ta4_tank"}
|
||||
|
||||
techage.ConstructionPlans["ta4_reactor"] = {
|
||||
plans["ta4_reactor"] = {
|
||||
{false, false, false, false, false, false, SIDEV, false, false, false, false},
|
||||
{false, IMG43, false, false, false, false, false, false, false, false, false},
|
||||
{false, false, false, false, PN000, PIPEH, PIPEH, PN270, false, false, false},
|
||||
@ -368,7 +368,7 @@ local NCLLE = {"techage_rotor.png", "techage:ta4_wind_turbine_nacelle"}
|
||||
local PILLR = {"techage:pillar", "techage:pillar"}
|
||||
local SLAMP = {"techage:rotor_signal_lamp_off", "techage:rotor_signal_lamp_off"}
|
||||
|
||||
techage.ConstructionPlans["ta4_windturbine"] = {
|
||||
plans["ta4_windturbine"] = {
|
||||
{false, false, false, SIDEV, false, false, false},
|
||||
{false, false, false, SLAMP, false, false, IMG_4, false},
|
||||
{false, false, false, ROTOR, NCLLE, false, false},
|
||||
@ -394,7 +394,7 @@ local GRAVL = {"default_gravel.png", "default:gravel"}
|
||||
local INLET = {"basic_materials_concrete_block.png^techage_gaspipe.png^[transformR90", "techage:ta4_pipe_inlet"}
|
||||
local OGLAS = {"default_obsidian_glass.png", "default:obsidian_glass"}
|
||||
|
||||
techage.ConstructionPlans["ta4_storagesystem"] = {
|
||||
plans["ta4_storagesystem"] = {
|
||||
{false, false, TOP_V, false, false, false, false, SIDEV, false, IMG41, false},
|
||||
{false, false, PN000, PIPEH, PIPEH, PIPEH, PN270, false, false, false, false},
|
||||
{CONCR, CONCR, INLET, CONCR, CONCR, false, PIPEV, false, false, false, false},
|
||||
@ -414,7 +414,7 @@ local RCBLE = {"techage_ta4_cable_inv.png", "techage:ta4_power_cableS"}
|
||||
local CARRI = {"techage:ta4_solar_carrier", "techage:ta4_solar_carrier"}
|
||||
local INVAC = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverter.png", "techage:ta4_solar_inverter"}
|
||||
|
||||
techage.ConstructionPlans["ta4_solarplant"] = {
|
||||
plans["ta4_solarplant"] = {
|
||||
{false, false, false, false, false, false, false, false, false, IMG42, false},
|
||||
{false, false, TOP_V, false, false, false, false, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false, false},
|
||||
@ -433,7 +433,7 @@ local PWETR = {"basic_materials_concrete_block.png^techage_gaspipe.png", "techag
|
||||
local TANK4 = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", "techage:ta4_tank"}
|
||||
local LFFIL = {"basic_materials_concrete_block.png^techage_gaspipe_hole.png", "techage:ta4_liquid_filter_filler"}
|
||||
|
||||
techage.ConstructionPlans["ta4_liquid_filter_base"] = {
|
||||
plans["ta4_liquid_filter_base"] = {
|
||||
{false, false, false, false, false, false, false, false, IMG44, false},
|
||||
{false, false, false, TOP_V, false, false, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false},
|
||||
@ -444,7 +444,7 @@ techage.ConstructionPlans["ta4_liquid_filter_base"] = {
|
||||
{false, CONCR, CONCR, CONCR, CONCR, CONCR},
|
||||
}
|
||||
|
||||
techage.ConstructionPlans["ta4_liquid_filter_gravel"] = {
|
||||
plans["ta4_liquid_filter_gravel"] = {
|
||||
{false, false, false, false, false, false, false, false, IMG44, false},
|
||||
{false, false, false, TOP_V, false, false, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false},
|
||||
@ -455,7 +455,7 @@ techage.ConstructionPlans["ta4_liquid_filter_gravel"] = {
|
||||
{false, CONCR, OGLAS, OGLAS, OGLAS, CONCR},
|
||||
}
|
||||
|
||||
techage.ConstructionPlans["ta4_liquid_filter_top"] = {
|
||||
plans["ta4_liquid_filter_top"] = {
|
||||
{false, false, false, false, false, false, false, false, IMG44, false},
|
||||
{false, false, false, TOP_V, false, false, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false},
|
||||
@ -472,7 +472,7 @@ techage.ConstructionPlans["ta4_liquid_filter_top"] = {
|
||||
local STEEL = {"default_steel_block.png", "techage:ta4_colliderblock"}
|
||||
local COOL4 = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_cooler.png", "techage:ta4_collider_cooler"}
|
||||
|
||||
techage.ConstructionPlans["techage_collider_plan"] = {
|
||||
plans["techage_collider_plan"] = {
|
||||
{IMG45, false, false, false},
|
||||
{false, false, false, false},
|
||||
{false, false, false, false},
|
||||
@ -487,7 +487,7 @@ techage.ConstructionPlans["techage_collider_plan"] = {
|
||||
local STEEL = {"default_steel_block.png", "techage:ta4_colliderblock"}
|
||||
local COOL4 = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_cooler.png", "techage:ta4_collider_cooler"}
|
||||
|
||||
techage.ConstructionPlans["ta4_cooler"] = {
|
||||
plans["ta4_cooler"] = {
|
||||
{false, false, false, SIDEV, false, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false},
|
||||
{false, STEEL, PIPEH, HEXR1, PIPEH, COOL4, PN270, false, false},
|
||||
@ -504,7 +504,7 @@ local TELET = {"techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_telep
|
||||
local PUMP4 = {"techage_filling_ta4.png^techage_appl_pump.png^techage_frame_ta4.png", "techage:t4_pump"}
|
||||
local ARROW = {"techage_form_arrow.png"}
|
||||
|
||||
techage.ConstructionPlans["ta5_teleport"] = {
|
||||
plans["ta5_teleport"] = {
|
||||
{false, false, false, false, false, false, false, false, false, false, false},
|
||||
{false, CHEST, PushR, TELET, false, ARROW, false, TELET, Tubes, CHEST, false},
|
||||
{false, false, false, false, false, false, false, false, false, false, false},
|
||||
@ -524,7 +524,7 @@ local MAGN2 = {"techage_collider_magnet.png^techage_steel_tiles_top3.png^[transf
|
||||
local MAGN3 = {"techage_collider_magnet.png^techage_steel_tiles_top3.png^[transformR180]", "techage:ta5_magnet1"}
|
||||
local MAGN4 = {"techage_collider_magnet.png^techage_steel_tiles_top3.png^[transformR270]", "techage:ta5_magnet1"}
|
||||
|
||||
techage.ConstructionPlans["ta5_fusion_reactor"] = {
|
||||
plans["ta5_fusion_reactor"] = {
|
||||
{false, false, false, false, false, false, IMG46, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false, false, false, false},
|
||||
@ -548,7 +548,7 @@ local HEX53 = {"techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole
|
||||
local TURB5 = {"techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta5.png", "techage:ta5_turbine"}
|
||||
local GENE5 = {"techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_generator.png^[transformFX]", "techage:ta5_generator"}
|
||||
|
||||
techage.ConstructionPlans["ta5_heatexchanger"] = {
|
||||
plans["ta5_heatexchanger"] = {
|
||||
{false, false, false, false, SIDEV, false, false, false},
|
||||
{false, false, false, false, false, false, false, false},
|
||||
{false, false, false, false, false, false, false, false},
|
||||
@ -559,9 +559,37 @@ techage.ConstructionPlans["ta5_heatexchanger"] = {
|
||||
{false, false, false, false, false, false, false, false},
|
||||
}
|
||||
|
||||
-- Bring into legacy format
|
||||
local function reformat(plan)
|
||||
for y=1,#plan do
|
||||
for x=1,#plan[1] do
|
||||
local item = plan[y][x] or false
|
||||
if item ~= false then
|
||||
local var1, var2 = item[1], item[2]
|
||||
|
||||
function techage.add_manual_plans(table_with_plans)
|
||||
for name, tbl in pairs(table_with_plans) do
|
||||
techage.ConstructionPlans[name] = tbl
|
||||
if var1 == "top_view" then
|
||||
plan[y][x] = {"text", var1}
|
||||
elseif var1 == "side_view" then
|
||||
plan[y][x] = {"text", var1}
|
||||
elseif var1 == "sectional_view" then
|
||||
plan[y][x] = {"text", var1}
|
||||
elseif var1 == "" then
|
||||
plan[y][x] = {"img", var2, "2.2,2.2"}
|
||||
elseif var1 == "10x10" then
|
||||
plan[y][x] = {"img", var2, "10,10"}
|
||||
elseif var1 == "5x4" then
|
||||
plan[y][x] = {"img", var2, "5,4"}
|
||||
else
|
||||
plan[y][x] = {"item", var1, var2}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return plan
|
||||
end
|
||||
|
||||
for name, plan in pairs(plans) do
|
||||
local plan2 = reformat(plan)
|
||||
doclib.add_manual_plan("techage", "EN", name, plan2)
|
||||
doclib.add_manual_plan("techage", "DE", name, plan2)
|
||||
end
|
||||
|
@ -24,7 +24,7 @@ local power = networks.power
|
||||
local control = networks.control
|
||||
|
||||
local CYCLE_TIME = 2
|
||||
local STANDBY_TICKS = 0
|
||||
local STANDBY_TICKS = 1
|
||||
local COUNTDOWN_TICKS = 1
|
||||
local PWR_NEEDED = 400
|
||||
local EXPECTED_PLASMA_NUM = 56
|
||||
|
@ -3,7 +3,7 @@
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019-2022 Joachim Stolberg
|
||||
Copyright (C) 2019-2023 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
@ -20,8 +20,14 @@ local power = networks.power
|
||||
local control = networks.control
|
||||
|
||||
local CYCLE_TIME = 2
|
||||
local STANDBY_TICKS = 1
|
||||
local COUNTDOWN_TICKS = 2
|
||||
local PWR_PERF = 800
|
||||
|
||||
local function formspec(self, pos, nvm)
|
||||
return techage.generator_formspec(self, pos, nvm, S("TA5 Generator"), nvm.provided, PWR_PERF)
|
||||
end
|
||||
|
||||
local function swap_node(pos, name)
|
||||
local node = techage.get_node_lvm(pos)
|
||||
if node.name == name then
|
||||
@ -31,6 +37,13 @@ local function swap_node(pos, name)
|
||||
minetest.swap_node(pos, node)
|
||||
end
|
||||
|
||||
local function can_start(pos, nvm, state)
|
||||
if nvm.alive_cnt and nvm.alive_cnt > 0 then
|
||||
return true
|
||||
end
|
||||
return S("no steam")
|
||||
end
|
||||
|
||||
local function start_node(pos, nvm)
|
||||
local meta = M(pos)
|
||||
nvm.provided = 0
|
||||
@ -38,8 +51,6 @@ local function start_node(pos, nvm)
|
||||
techage.evaluate_charge_termination(nvm, meta)
|
||||
local outdir = meta:get_int("outdir")
|
||||
power.start_storage_calc(pos, Cable, outdir)
|
||||
swap_node(pos, "techage:ta5_generator_on")
|
||||
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
||||
end
|
||||
|
||||
local function stop_node(pos, nvm)
|
||||
@ -47,7 +58,32 @@ local function stop_node(pos, nvm)
|
||||
nvm.alive_cnt = 0
|
||||
local outdir = M(pos):get_int("outdir")
|
||||
power.start_storage_calc(pos, Cable, outdir)
|
||||
swap_node(pos, "techage:ta5_generator")
|
||||
end
|
||||
|
||||
local State = techage.NodeStates:new({
|
||||
node_name_passive = "techage:ta5_generator",
|
||||
node_name_active = "techage:ta5_generator_on",
|
||||
cycle_time = CYCLE_TIME,
|
||||
standby_ticks = STANDBY_TICKS,
|
||||
formspec_func = formspec,
|
||||
infotext_name = S("TA5 Generator"),
|
||||
can_start = can_start,
|
||||
start_node = start_node,
|
||||
stop_node = stop_node,
|
||||
})
|
||||
|
||||
local function on_receive_fields(pos, formname, fields, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return
|
||||
end
|
||||
local nvm = techage.get_nvm(pos)
|
||||
State:state_button_event(pos, nvm, fields)
|
||||
end
|
||||
|
||||
local function on_rightclick(pos, node, clicker)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
techage.set_activeformspec(pos, clicker)
|
||||
M(pos):set_string("formspec", formspec(State, pos, nvm))
|
||||
end
|
||||
|
||||
local function get_generator_data(pos, outdir, tlib2)
|
||||
@ -59,8 +95,15 @@ end
|
||||
|
||||
local function node_timer(pos, elapsed)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
local running = techage.is_running(nvm)
|
||||
nvm.alive_cnt = (nvm.alive_cnt or 0) - 1
|
||||
if nvm.alive_cnt > 0 then
|
||||
local alive = nvm.alive_cnt > 0
|
||||
if running and not alive then
|
||||
State:standby(pos, nvm, S("no steam"))
|
||||
stop_node(pos, nvm, State)
|
||||
elseif not running and alive then
|
||||
State:start(pos, nvm)
|
||||
elseif running then
|
||||
local meta = M(pos)
|
||||
local outdir = meta:get_int("outdir")
|
||||
local tp1 = tonumber(meta:get_string("termpoint1"))
|
||||
@ -70,12 +113,12 @@ local function node_timer(pos, elapsed)
|
||||
if val > 0 then
|
||||
nvm.load = val
|
||||
end
|
||||
return true
|
||||
else
|
||||
swap_node(pos, "techage:ta5_generator")
|
||||
stop_node(pos, nvm)
|
||||
return false
|
||||
State:keep_running(pos, nvm, COUNTDOWN_TICKS)
|
||||
end
|
||||
if techage.is_activeformspec(pos) then
|
||||
M(pos):set_string("formspec", formspec(State, pos, nvm))
|
||||
end
|
||||
return State:is_active(nvm)
|
||||
end
|
||||
|
||||
minetest.register_node("techage:ta5_generator", {
|
||||
@ -91,7 +134,11 @@ minetest.register_node("techage:ta5_generator", {
|
||||
},
|
||||
|
||||
after_place_node = function(pos, placer)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
local number = techage.add_node(pos, "techage:ta5_generator")
|
||||
State:node_init(pos, nvm, number)
|
||||
M(pos):set_int("outdir", networks.side_to_outdir(pos, "R"))
|
||||
M(pos):set_string("formspec", formspec(State, pos, nvm))
|
||||
Cable:after_place_node(pos)
|
||||
end,
|
||||
after_dig_node = function(pos, oldnode)
|
||||
@ -101,6 +148,8 @@ minetest.register_node("techage:ta5_generator", {
|
||||
|
||||
get_generator_data = get_generator_data,
|
||||
ta4_formspec = techage.generator_settings("ta4", PWR_PERF),
|
||||
on_receive_fields = on_receive_fields,
|
||||
on_rightclick = on_rightclick,
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky=2, crumbly=2, choppy=2},
|
||||
on_rotate = screwdriver.disallow,
|
||||
@ -140,6 +189,8 @@ minetest.register_node("techage:ta5_generator_on", {
|
||||
|
||||
get_generator_data = get_generator_data,
|
||||
ta4_formspec = techage.generator_settings("ta4", PWR_PERF),
|
||||
on_receive_fields = on_receive_fields,
|
||||
on_rightclick = on_rightclick,
|
||||
on_timer = node_timer,
|
||||
paramtype2 = "facedir",
|
||||
drop = "",
|
||||
@ -159,17 +210,40 @@ techage.register_node({"techage:ta5_generator", "techage:ta5_generator_on"}, {
|
||||
if topic == "trigger" then
|
||||
nvm.alive_cnt = 5
|
||||
elseif topic == "start" then
|
||||
start_node(pos, nvm)
|
||||
--start_node(pos, nvm)
|
||||
elseif topic == "stop" then
|
||||
stop_node(pos, nvm)
|
||||
end
|
||||
end,
|
||||
on_recv_message = function(pos, src, topic, payload)
|
||||
return "unsupported"
|
||||
local nvm = techage.get_nvm(pos)
|
||||
if topic == "delivered" then
|
||||
return nvm.provided or 0
|
||||
else
|
||||
return State:on_receive_message(pos, topic, payload)
|
||||
end
|
||||
end,
|
||||
on_beduino_receive_cmnd = function(pos, src, topic, payload)
|
||||
return State:on_beduino_receive_cmnd(pos, topic, payload)
|
||||
end,
|
||||
on_beduino_request_data = function(pos, src, topic, payload)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
if topic == 135 then
|
||||
return 0, {nvm.provided or 0}
|
||||
else
|
||||
return State:on_beduino_request_data(pos, topic, payload)
|
||||
end
|
||||
end,
|
||||
on_node_load = function(pos)
|
||||
-- remove legacy formspec
|
||||
M(pos):set_string("formspec", "")
|
||||
-- Add node number if missing
|
||||
local number = M(pos):get_string("node_number")
|
||||
if number == "" then
|
||||
local nvm = techage.get_nvm(pos)
|
||||
local number = techage.add_node(pos, "techage:ta5_generator")
|
||||
State:node_init(pos, nvm, number)
|
||||
State:start(pos, nvm)
|
||||
M(pos):set_string("formspec", formspec(State, pos, nvm))
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
|
@ -91,7 +91,7 @@ techage.register_node({"techage:ta5_heatexchanger1"}, {
|
||||
on_transfer = function(pos, indir, topic, payload)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
-- used by heatexchanger2
|
||||
if topic == "test_gas_blue" then
|
||||
if topic == "test_pipe_blue" or topic == "test_gas_blue" then
|
||||
return control_cmnd(pos, topic)
|
||||
else
|
||||
return turbine_cmnd(pos, topic, payload)
|
||||
|
@ -93,7 +93,10 @@ sched.register(tSched, CALL_RATE1, 1, function(pos)
|
||||
return true
|
||||
end)
|
||||
sched.register(tSched, CALL_RATE1, 2, function(pos)
|
||||
local resp = heatexchanger1_cmnd(pos, "test_gas_blue")
|
||||
local resp = heatexchanger1_cmnd(pos, "test_pipe_blue")
|
||||
if type(resp) ~= "table" then
|
||||
return DESCRIPTION .. S(" Error!")
|
||||
end
|
||||
local cnt = count_trues(resp)
|
||||
if cnt ~= EXPECT_BLUE then
|
||||
return S("Blue pipe connection error\n(@1 found / @2 expected)", cnt, EXPECT_BLUE)
|
||||
@ -101,14 +104,30 @@ sched.register(tSched, CALL_RATE1, 2, function(pos)
|
||||
return true
|
||||
end)
|
||||
sched.register(tSched, CALL_RATE1, 3, function(pos)
|
||||
local resp = heatexchanger3_cmnd(pos, "test_gas_green")
|
||||
local resp = heatexchanger3_cmnd(pos, "test_pipe_green")
|
||||
local cnt = count_trues(resp)
|
||||
if cnt ~= EXPECT_GREEN then
|
||||
return S("Green pipe connection error\n(@1 found / @2 expected)", cnt, EXPECT_GREEN)
|
||||
end
|
||||
return true
|
||||
end)
|
||||
sched.register(tSched, CALL_RATE2, 4, function(pos)
|
||||
sched.register(tSched, CALL_RATE1, 4, function(pos)
|
||||
local resp = heatexchanger1_cmnd(pos, "test_gas_blue")
|
||||
local cnt = count_trues(resp)
|
||||
if cnt ~= EXPECT_BLUE then
|
||||
return S("Blue pipe coolant missing\n(@1 found / @2 expected)", cnt, EXPECT_BLUE)
|
||||
end
|
||||
return true
|
||||
end)
|
||||
sched.register(tSched, CALL_RATE1, 5, function(pos)
|
||||
local resp = heatexchanger3_cmnd(pos, "test_gas_green")
|
||||
local cnt = count_trues(resp)
|
||||
if cnt ~= EXPECT_GREEN then
|
||||
return S("Green pipe coolant missing\n(@1 found / @2 expected)", cnt, EXPECT_GREEN)
|
||||
end
|
||||
return true
|
||||
end)
|
||||
sched.register(tSched, CALL_RATE2, 6, function(pos)
|
||||
local resp = heatexchanger3_cmnd(pos, "dec_power")
|
||||
local cnt = count_trues(resp)
|
||||
--print("dec_power", cnt)
|
||||
@ -123,7 +142,7 @@ local function can_start(pos, nvm)
|
||||
return S("No power")
|
||||
end
|
||||
heatexchanger3_cmnd(pos, "rst_power")
|
||||
for i = 0,4 do
|
||||
for i = 0,6 do
|
||||
local res = tSched[i](pos)
|
||||
if res ~= true and res ~= 1 then return res end
|
||||
end
|
||||
@ -167,7 +186,7 @@ local State = techage.NodeStates:new({
|
||||
node_name_passive = "techage:ta5_heatexchanger2",
|
||||
cycle_time = CYCLE_TIME,
|
||||
infotext_name = DESCRIPTION,
|
||||
standby_ticks = 0,
|
||||
standby_ticks = 1,
|
||||
can_start = can_start,
|
||||
start_node = start_node,
|
||||
stop_node = stop_node,
|
||||
|
@ -198,6 +198,13 @@ local function on_request(pos, tlib2, topic)
|
||||
else -- Pipe
|
||||
if topic == "dec_power" then
|
||||
return dec_power(nvm)
|
||||
elseif topic == "test_pipe_blue" then
|
||||
nvm.test_pipe = true
|
||||
return true
|
||||
elseif topic == "test_pipe_green" then
|
||||
local res = nvm.test_pipe
|
||||
nvm.test_pipe = false
|
||||
return res
|
||||
elseif topic == "test_gas_blue" then
|
||||
nvm.has_gas = true
|
||||
return nvm.liquid.amount == CAPACITY
|
||||
|
@ -41,7 +41,7 @@ function techage.display.display_update(pos, objref)
|
||||
local text = lcdlib_bugfix(nvm.text)
|
||||
local texture = lcdlib.make_multiline_texture(
|
||||
"default", text,
|
||||
70, 70, NUM_ROWS, "top", "#000")
|
||||
70, 70, NUM_ROWS, "top", "#000", nil, true)
|
||||
objref:set_properties({ textures = {texture},
|
||||
visual_size = {x=0.94, y=0.94} })
|
||||
end
|
||||
@ -52,7 +52,7 @@ function techage.display.display_updateXL(pos, objref)
|
||||
local text = lcdlib_bugfix(nvm.text)
|
||||
local texture = lcdlib.make_multiline_texture(
|
||||
"default", text,
|
||||
126, 70, NUM_ROWS, "top", "#000")
|
||||
126, 70, NUM_ROWS, "top", "#000", nil, true)
|
||||
objref:set_properties({ textures = {texture},
|
||||
visual_size = {x=0.94*1.9, y=0.94} })
|
||||
end
|
||||
|
@ -13,7 +13,7 @@
|
||||
techage = {}
|
||||
|
||||
-- Version for compatibility checks, see readme.md/history
|
||||
techage.version = 1.15
|
||||
techage.version = 1.17
|
||||
|
||||
if minetest.global_exists("tubelib") then
|
||||
minetest.log("error", "[techage] Techage can't be used together with the mod tubelib!")
|
||||
@ -30,8 +30,8 @@ elseif minetest.global_exists("tubelib2") and tubelib2.version < 2.2 then
|
||||
elseif minetest.global_exists("minecart") and minecart.version < 2.04 then
|
||||
minetest.log("error", "[techage] Techage requires minecart version 2.04 or newer!")
|
||||
return
|
||||
elseif minetest.global_exists("lcdlib") and lcdlib.version < 1.01 then
|
||||
minetest.log("error", "[techage] Techage requires lcdlib version 1.01 or newer!")
|
||||
elseif minetest.global_exists("lcdlib") and lcdlib.version < 1.03 then
|
||||
minetest.log("error", "[techage] Techage requires lcdlib version 1.03 or newer!")
|
||||
return
|
||||
elseif minetest.global_exists("safer_lua") and safer_lua.version < 1.01 then
|
||||
minetest.log("error", "[techage] Techage requires safer_lua version 1.01 or newer!")
|
||||
@ -52,7 +52,6 @@ techage.NodeDef = {} -- node registration info
|
||||
|
||||
techage.max_num_forceload_blocks = tonumber(minetest.settings:get("techage_max_num_forceload_blocks")) or 24
|
||||
|
||||
techage.basalt_stone_enabled = minetest.settings:get_bool("techage_basalt_stone_enabled") ~= false
|
||||
techage.ore_rarity = tonumber(minetest.settings:get("techage_ore_rarity")) or 1
|
||||
techage.modified_recipes_enabled = minetest.settings:get_bool("techage_modified_recipes_enabled") ~= false
|
||||
techage.collider_min_depth = tonumber(minetest.settings:get("techage_collider_min_depth")) or -28
|
||||
@ -109,12 +108,9 @@ dofile(MP.."/basis/teleport.lua")
|
||||
dofile(MP.."/basis/fly_lib.lua")
|
||||
|
||||
-- Main doc
|
||||
dofile(MP.."/doc/manual_DE.lua")
|
||||
dofile(MP.."/doc/manual_EN.lua")
|
||||
dofile(MP.."/doc/guide.lua")
|
||||
dofile(MP.."/doc/plans.lua")
|
||||
dofile(MP.."/doc/items.lua")
|
||||
dofile(MP.."/doc/guide.lua") -- construction guides
|
||||
dofile(MP.."/doc/manual_api.lua") -- external API
|
||||
|
||||
dofile(MP.."/items/filling.lua")
|
||||
|
||||
@ -290,8 +286,12 @@ dofile(MP.."/logic/logic_block.lua") -- new
|
||||
dofile(MP.."/logic/node_detector.lua")
|
||||
dofile(MP.."/logic/light_detector.lua")
|
||||
dofile(MP.."/logic/player_detector.lua")
|
||||
dofile(MP.."/logic/gaze_sensor.lua")
|
||||
dofile(MP.."/logic/command_converter.lua")
|
||||
dofile(MP.."/logic/flipflop.lua")
|
||||
dofile(MP.."/logic/mba_detector.lua")
|
||||
dofile(MP.."/logic/cart_detector.lua")
|
||||
dofile(MP.."/logic/charge_detector.lua")
|
||||
dofile(MP.."/logic/collector.lua")
|
||||
dofile(MP.."/logic/button_2x.lua")
|
||||
dofile(MP.."/logic/button_4x.lua")
|
||||
|
@ -459,6 +459,8 @@ minetest.register_node("techage:meltingpot", {
|
||||
|
||||
can_dig = can_dig,
|
||||
|
||||
paramtype = "light",
|
||||
use_texture_alpha = techage.CLIP,
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 3},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
|
@ -68,3 +68,8 @@ techage.register_mobs_mods("ts_vehicles_cars")
|
||||
|
||||
-- Used as e.g. crane cable
|
||||
techage.register_simple_nodes({"techage:power_lineS"}, true)
|
||||
|
||||
-- Mods like cottages add the function ``after_dig_node`` to the dirt blocks
|
||||
techage.register_simple_nodes({"default:dirt", "default:dirt_with_grass", "default:dirt_with_grass_footsteps",
|
||||
"default:dirt_with_dry_grass", "default:dirt_with_snow", "default:dirt_with_rainforest_litter",
|
||||
"default:dirt_with_coniferous_litter"}, true)
|
||||
|
@ -188,9 +188,6 @@ function techage.register_flower(name)
|
||||
end
|
||||
|
||||
function techage.register_plant(name)
|
||||
if contains(Plants, name) then
|
||||
return
|
||||
end
|
||||
Plants[name] = true
|
||||
end
|
||||
|
||||
|
@ -137,7 +137,9 @@ techage.register_node({"techage:filler"}, {
|
||||
end,
|
||||
on_push_item = function(pos, in_dir, stack)
|
||||
local inv = M(pos):get_inventory()
|
||||
if not minetest.get_node_timer(pos):is_started() then
|
||||
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
||||
end
|
||||
return techage.put_items(inv, "src", stack)
|
||||
end,
|
||||
on_unpull_item = function(pos, in_dir, stack)
|
||||
|
@ -57,6 +57,17 @@ local State4 = techage.NodeStates:new({
|
||||
standby_ticks = STANDBY_TICKS,
|
||||
})
|
||||
|
||||
local function handle_pump_limit(pos, nvm)
|
||||
local val = M(pos):get_int("limit")
|
||||
if val and val > 0 then
|
||||
nvm.limit = val
|
||||
nvm.num_items = 0
|
||||
else
|
||||
nvm.limit = nil
|
||||
nvm.num_items = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- Function returns the number of pumped units
|
||||
local function pump(pos, mem, nvm, state, outdir, units)
|
||||
local taken, name = liquid.take(pos, Pipe, Flip[outdir], nil, units, mem.dbg_cycles > 0)
|
||||
@ -152,20 +163,20 @@ local function on_rightclick(pos, node, clicker)
|
||||
elseif node.name == "techage:t4_pump" then
|
||||
local mem = techage.get_mem(pos)
|
||||
mem.dbg_cycles = 5
|
||||
local val = M(pos):get_int("limit")
|
||||
if val and val > 0 then
|
||||
nvm.limit = val
|
||||
nvm.num_items = 0
|
||||
else
|
||||
nvm.limit = nil
|
||||
nvm.num_items = nil
|
||||
end
|
||||
handle_pump_limit(pos, nvm)
|
||||
State4:start(pos, nvm)
|
||||
elseif node.name == "techage:t4_pump_on" then
|
||||
State4:stop(pos, nvm)
|
||||
end
|
||||
end
|
||||
|
||||
local function ta_rotate_node(pos, node, new_param2)
|
||||
Pipe:after_dig_node(pos)
|
||||
minetest.swap_node(pos, {name = node.name, param2 = new_param2})
|
||||
Pipe:after_place_node(pos)
|
||||
M(pos):set_int("outdir", techage.side_to_outdir("R", new_param2))
|
||||
end
|
||||
|
||||
local function after_dig_node(pos, oldnode, oldmetadata, digger)
|
||||
Pipe:after_dig_node(pos)
|
||||
techage.remove_node(pos, oldnode, oldmetadata)
|
||||
@ -175,7 +186,7 @@ end
|
||||
local ta3_tiles_pas = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png",
|
||||
"techage_filling_ta3.png^techage_frame_ta3_bottom.png",
|
||||
"techage_filling_ta3.png^techage_frame_ta3_bottom.png^techage_appl_arrow.png",
|
||||
"techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png",
|
||||
"techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png",
|
||||
"techage_filling_ta3.png^techage_appl_pump.png^techage_frame_ta3.png^[transformFX",
|
||||
@ -185,7 +196,7 @@ local ta3_tiles_pas = {
|
||||
local ta4_tiles_pas = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png",
|
||||
"techage_filling_ta4.png^techage_frame_ta4_bottom.png",
|
||||
"techage_filling_ta4.png^techage_frame_ta4_bottom.png^techage_appl_arrow.png",
|
||||
"techage_filling_ta4.png^techage_appl_hole_pipe.png^techage_frame_ta4.png",
|
||||
"techage_filling_ta4.png^techage_appl_hole_pipe.png^techage_frame_ta4.png",
|
||||
"techage_filling_ta4.png^techage_appl_pump.png^techage_frame_ta4.png^[transformFX",
|
||||
@ -195,7 +206,7 @@ local ta4_tiles_pas = {
|
||||
local ta3_tiles_act = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png",
|
||||
"techage_filling_ta3.png^techage_frame_ta3_bottom.png",
|
||||
"techage_filling_ta3.png^techage_frame_ta3_bottom.png^techage_appl_arrow.png",
|
||||
"techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png",
|
||||
"techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png",
|
||||
{
|
||||
@ -223,7 +234,7 @@ local ta3_tiles_act = {
|
||||
local ta4_tiles_act = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png",
|
||||
"techage_filling_ta4.png^techage_frame_ta4_bottom.png",
|
||||
"techage_filling_ta4.png^techage_frame_ta4_bottom.png^techage_appl_arrow.png",
|
||||
"techage_filling_ta4.png^techage_appl_hole_pipe.png^techage_frame_ta4.png",
|
||||
"techage_filling_ta4.png^techage_appl_hole_pipe.png^techage_frame_ta4.png",
|
||||
{
|
||||
@ -255,6 +266,7 @@ minetest.register_node("techage:t3_pump", {
|
||||
on_rightclick = on_rightclick,
|
||||
on_timer = node_timer3,
|
||||
after_dig_node = after_dig_node,
|
||||
ta_rotate_node = ta_rotate_node,
|
||||
on_rotate = screwdriver.disallow,
|
||||
paramtype2 = "facedir",
|
||||
on_rotate = screwdriver.disallow,
|
||||
@ -286,6 +298,7 @@ minetest.register_node("techage:t4_pump", {
|
||||
on_rightclick = on_rightclick,
|
||||
on_timer = node_timer4,
|
||||
after_dig_node = after_dig_node,
|
||||
ta_rotate_node = ta_rotate_node,
|
||||
on_rotate = screwdriver.disallow,
|
||||
paramtype2 = "facedir",
|
||||
on_rotate = screwdriver.disallow,
|
||||
@ -340,6 +353,10 @@ techage.register_node({"techage:t4_pump", "techage:t4_pump_on"}, {
|
||||
local nvm = techage.get_nvm(pos)
|
||||
return nvm.flowrate or 0
|
||||
else
|
||||
if topic == "on" then
|
||||
local nvm = techage.get_nvm(pos)
|
||||
handle_pump_limit(pos, nvm)
|
||||
end
|
||||
return State4:on_receive_message(pos, topic, payload)
|
||||
end
|
||||
end,
|
||||
@ -358,9 +375,9 @@ techage.register_node({"techage:t4_pump", "techage:t4_pump_on"}, {
|
||||
end
|
||||
return 0
|
||||
else
|
||||
if topic == 1 then
|
||||
local nvm = techage.get_nvm(pos)
|
||||
if nvm.limit then
|
||||
nvm.num_items = 0
|
||||
handle_pump_limit(pos, nvm)
|
||||
end
|
||||
return State4:on_beduino_receive_cmnd(pos, topic, payload)
|
||||
end
|
||||
|
@ -117,7 +117,6 @@ Access:=Zugriff:
|
||||
Button or switch=Taster oder Schalter
|
||||
Change the block name (infotext)=Ändere den Blocknamen
|
||||
Command to be sent=Zu sendender Befehl
|
||||
Destination block number(s)=Zielblocknummer
|
||||
Infotext=Infotext
|
||||
TA3 Button/Switch=TA3 Taster/Schalter
|
||||
TA4 Button/Switch=TA4 Schalter/Taster
|
||||
@ -133,6 +132,8 @@ Type=Typ
|
||||
### button.lua ###
|
||||
### button_2x.lua ###
|
||||
### button_4x.lua ###
|
||||
### charge_detector.lua ###
|
||||
### gaze_sensor.lua ###
|
||||
### player_detector.lua ###
|
||||
|
||||
Command=Kommando
|
||||
@ -140,7 +141,9 @@ Number=Nummer
|
||||
|
||||
### button.lua ###
|
||||
### cart_detector.lua ###
|
||||
### command_converter.lua ###
|
||||
### detector.lua ###
|
||||
### flipflop.lua ###
|
||||
### light_detector.lua ###
|
||||
### lua_logic.lua ###
|
||||
### mesecons_converter.lua ###
|
||||
@ -152,8 +155,10 @@ Insert destination node number(s)=Gebe Zielnummer(n) ein
|
||||
|
||||
### button.lua ###
|
||||
### chest.lua ###
|
||||
### command_converter.lua ###
|
||||
### detector.lua ###
|
||||
### doorcontroller.lua ###
|
||||
### flipflop.lua ###
|
||||
### mesecons_converter.lua ###
|
||||
### repeater.lua ###
|
||||
### sequencer2.lua ###
|
||||
@ -161,6 +166,11 @@ Insert destination node number(s)=Gebe Zielnummer(n) ein
|
||||
|
||||
Save=Speichern
|
||||
|
||||
### button.lua ###
|
||||
### gaze_sensor.lua ###
|
||||
|
||||
Destination block number(s)=Zielblocknummer(n)
|
||||
|
||||
### button_2x.lua ###
|
||||
|
||||
TA4 2x Button=TA4 2x Taster
|
||||
@ -174,6 +184,7 @@ Momentary button or on/off switch=Taster oder Ein-/Ausschalter
|
||||
|
||||
### button_2x.lua ###
|
||||
### button_4x.lua ###
|
||||
### charge_detector.lua ###
|
||||
### player_detector.lua ###
|
||||
|
||||
Destination block number=Zielblocknummer
|
||||
@ -225,6 +236,14 @@ TA5 Ceramic Turbine=TA5 Keramikturbine
|
||||
Dirt with Ash=Erde mit Asche
|
||||
TA1 Charcoal=TA1 Holzkohle
|
||||
|
||||
### charge_detector.lua ###
|
||||
|
||||
Command to send when the energy storage charge@nlevel falls below the specified switch point=Befehl zum Senden, wenn der Ladezustand des@nEnergiespeichers den angegebenen Schaltpunkt unterschreitet
|
||||
Command to send when the energy storage charge@nlevel rises above the specified switch point=Befehl zum Senden, wenn der Ladezustand des@nEnergiespeichers den angegebenen Schaltpunkt überschreitet
|
||||
Storage charge level switch point=Schaltpunkt Speicherladezustand
|
||||
Switch point=Schaltpunkt
|
||||
TA4 Energy Storage Charge Detector=TA4 Energiespeicher-Ladungsdetektor
|
||||
|
||||
### chest.lua ###
|
||||
|
||||
Allow public access to the chest=Erlaube öffentlichen Zugriff auf die Kiste
|
||||
@ -249,6 +268,13 @@ Node numbers to read the states from=Knotennummern zum Lesen der Zustände
|
||||
Send an event if state is equal or larger than=Senden ein Event wenn Status größer oder gleich als
|
||||
TA4 State Collector=TA4 Zuständesammler
|
||||
|
||||
### command_converter.lua ###
|
||||
|
||||
Receive=Empfang
|
||||
Send delay (s)=Sendeverz. (s)
|
||||
Sent command=Sendekommando
|
||||
TA3 Command Converter=TA3 Kommando Konverter
|
||||
|
||||
### concentrator.lua ###
|
||||
|
||||
TA4 Tube Concentrator=TA4 Röhren Konzentrator
|
||||
@ -363,13 +389,20 @@ with door sound=mit Türgeräusch
|
||||
### doorcontroller2.lua ###
|
||||
### flycontroller.lua ###
|
||||
### movecontroller.lua ###
|
||||
### node_detector.lua ###
|
||||
### turncontroller.lua ###
|
||||
|
||||
Done=Fertig
|
||||
Record=Aufzeichnen
|
||||
Recording...=Aufzeichnung...
|
||||
block positions are stored.=Block Positionen gespeichert.
|
||||
|
||||
### doorcontroller2.lua ###
|
||||
### flycontroller.lua ###
|
||||
### movecontroller.lua ###
|
||||
### turncontroller.lua ###
|
||||
|
||||
Recording...=Aufzeichnung...
|
||||
|
||||
### doorcontroller2.lua ###
|
||||
### movecontroller.lua ###
|
||||
|
||||
@ -478,6 +511,10 @@ TA3 Power Station Firebox=TA3 Kraftwerks-Feuerbox
|
||||
|
||||
Firebox=Feuerkasten
|
||||
|
||||
### flipflop.lua ###
|
||||
|
||||
TA3 Flip-Flop=TA3 FlipFlop
|
||||
|
||||
### fly_lib.lua ###
|
||||
|
||||
Destination position is protected=Zielposition ist geschützt
|
||||
@ -498,8 +535,10 @@ Error: Invalid path !!=Fehler: Ungültiger Pfad !!
|
||||
|
||||
Error: Recording is missing !!=Fehler: Aufzeichnung fehlt !!
|
||||
Flight route (A to B)=Flug Route (A nach B)
|
||||
Move a player without moving blocks=Bewege einen Spieler ohne Blöcke
|
||||
See chat output=Siehe chat Ausgabe
|
||||
TA5 Fly Controller=TA5 Flug Controller
|
||||
Teleport mode=Teleport Mode
|
||||
Test=Test
|
||||
[TA4 Fly Controller] Invalid path!=[TA5 Flug Controller] Ungültiger Pfad!
|
||||
[TA4 Fly Controller] Recording is missing!=[TA5 Flug Controller] Aufzeichnung fehlt!
|
||||
@ -520,11 +559,9 @@ Maximum speed for moving blocks=Maximale Geschwindigkeit für bewegliche Blöcke
|
||||
Move=Bewege
|
||||
Move A-B=Bewege A-B
|
||||
Move B-A=Bewege B-A
|
||||
Move a player without moving blocks=Bewege einen Spieler ohne Blöcke
|
||||
Move block height=Move Block Höhe
|
||||
Object offset=Objekt Offset
|
||||
Stored=Gespeichert
|
||||
Teleport mode=Teleport Mode
|
||||
Value in the range of 0.0 to 1.0=Wert im Bereich von 0.0 bis 1.0
|
||||
Y-offset for non-player objects like vehicles (-0.5 to 0.5)=Y-Offset für Nicht-Spieler Objekte wie Fahrzeuge (-0.5 bis 0.5)
|
||||
|
||||
@ -595,6 +632,14 @@ TA5 Pipe=TA5 Leitung
|
||||
|
||||
TechAge Gate Block=TechAge Torblock
|
||||
|
||||
### gaze_sensor.lua ###
|
||||
|
||||
Command to send when sensor is no longer viewed=Befehl zum Senden, wenn der Sensor nicht mehr angesehen wird
|
||||
Command to send when sensor is viewed=Befehl zum Senden, wenn der Sensor angesehen wird
|
||||
Input the player name(s) separated by blanks.@nIf empty, only the owner is accepted.=Geben den/die Spielernamen durch Leerzeichen getrennt ein.@nWenn leer, wird nur der Besitzer akzeptiert.
|
||||
Player Names=Spielernamen
|
||||
TA4 Gaze Sensor=TA4 Blicksensor
|
||||
|
||||
### gearbox.lua ###
|
||||
|
||||
TA2 Gearbox=TA2 Getriebeblock
|
||||
@ -604,6 +649,7 @@ TA2 Gearbox=TA2 Getriebeblock
|
||||
TA3 Generator=TA3 Generator
|
||||
TA4 Generator=TA4 Generator
|
||||
TA5 Generator=TA5 Generator
|
||||
no steam=Kein Dampf
|
||||
|
||||
### generator.lua ###
|
||||
### power_terminal2.lua ###
|
||||
@ -636,14 +682,6 @@ TA1 Mill Base=Mühlenunterteil
|
||||
|
||||
TA4 LED Grow Light=TA4 LED Pflanzenlampe
|
||||
|
||||
### guide.lua ###
|
||||
|
||||
No plan available=Kein Plan verfügar
|
||||
Plan=Plan
|
||||
Sectional view=Schnittbild
|
||||
Side view=Seitenansicht
|
||||
Top view=Draufsicht
|
||||
|
||||
### hammer.lua ###
|
||||
|
||||
TA1 Bronze Hammer (smash stone to gravel)=TA1 Bronzehammer (zerschlage Stein zu Kies)
|
||||
@ -664,9 +702,12 @@ TA5 Heat Exchanger 1=TA5 Wärmetauscher 1
|
||||
|
||||
### heatexchanger2.lua ###
|
||||
|
||||
Error!=
|
||||
Blue pipe connection error@n(@1 found / @2 expected)=Verbindungsfehler blaue Leitung@n(@1 erkannt / @2 erwartet)
|
||||
Blue pipe coolant missing@n(@1 found / @2 expected)=Kühlmittel fehlt bei der blauen Leitung@n(@1 erkannt / @2 erwartet)
|
||||
Cooler error=Kühlungsfehler
|
||||
Green pipe connection error@n(@1 found / @2 expected)=Verbindungsfehler grüne Leitung@n(@1 erkannt / @2 erwartet)
|
||||
Green pipe coolant missing@n(@1 found / @2 expected)=Kühlmittel fehlt bei der grünen Leitung@n(@1 erkannt / @2 erwartet)
|
||||
Power network connection error=Stromnetz Verbindungsfehler
|
||||
TA4 Heat Exchanger=TA4 Wärmetauscher
|
||||
TA4 Heat Exchanger 2=TA4 Wärmetauscher 2
|
||||
@ -929,8 +970,10 @@ TA4 Move Controller=TA4 Move Controller
|
||||
|
||||
### node_detector.lua ###
|
||||
|
||||
Click on all blocks whose positions should be checked=Klicke auf alle Blöcke, deren Positionen überprüft werden sollen
|
||||
Send signal if nodes have been:=Sende ein Signal falls Blöcke:
|
||||
TA3 Node Detector=TA3 Block Detektor
|
||||
TA4 Node Detector=TA3 Block Detektor
|
||||
added=hinzugefügt wird
|
||||
added or removed=hinzugefügt oder entfernt wird
|
||||
removed=entfernt
|
||||
@ -1302,6 +1345,10 @@ Refresh=Aktualisieren
|
||||
TA1 Axle=TA1 Achse
|
||||
TA1 Axle Bearing=TA1 Achsenlager
|
||||
|
||||
### ta2_clutch.lua ###
|
||||
|
||||
TA2 Clutch=
|
||||
|
||||
### ta2_weight_chest.lua ###
|
||||
|
||||
TA2 Weight Chest=TA2 Gewichtekiste
|
||||
@ -1529,6 +1576,11 @@ TA4 Collider Detector Worker=TA4 Collider Detektor Worker
|
||||
|
||||
##### not used anymore #####
|
||||
|
||||
No plan available=Kein Plan verfügar
|
||||
Plan=Plan
|
||||
Sectional view=Schnittbild
|
||||
Side view=Seitenansicht
|
||||
Top view=Draufsicht
|
||||
Blocks are back=Blöcke sind wieder da
|
||||
Blocks are disappeared=Blöcke sind verschwunden
|
||||
Remove=Entfernen
|
||||
|
@ -117,7 +117,6 @@ Access:=
|
||||
Button or switch=
|
||||
Change the block name (infotext)=
|
||||
Command to be sent=
|
||||
Destination block number(s)=
|
||||
Infotext=
|
||||
TA3 Button/Switch=
|
||||
TA4 Button/Switch=
|
||||
@ -133,6 +132,8 @@ Type=
|
||||
### button.lua ###
|
||||
### button_2x.lua ###
|
||||
### button_4x.lua ###
|
||||
### charge_detector.lua ###
|
||||
### gaze_sensor.lua ###
|
||||
### player_detector.lua ###
|
||||
|
||||
Command=
|
||||
@ -140,7 +141,9 @@ Number=
|
||||
|
||||
### button.lua ###
|
||||
### cart_detector.lua ###
|
||||
### command_converter.lua ###
|
||||
### detector.lua ###
|
||||
### flipflop.lua ###
|
||||
### light_detector.lua ###
|
||||
### lua_logic.lua ###
|
||||
### mesecons_converter.lua ###
|
||||
@ -152,8 +155,10 @@ Insert destination node number(s)=
|
||||
|
||||
### button.lua ###
|
||||
### chest.lua ###
|
||||
### command_converter.lua ###
|
||||
### detector.lua ###
|
||||
### doorcontroller.lua ###
|
||||
### flipflop.lua ###
|
||||
### mesecons_converter.lua ###
|
||||
### repeater.lua ###
|
||||
### sequencer2.lua ###
|
||||
@ -161,6 +166,11 @@ Insert destination node number(s)=
|
||||
|
||||
Save=
|
||||
|
||||
### button.lua ###
|
||||
### gaze_sensor.lua ###
|
||||
|
||||
Destination block number(s)=
|
||||
|
||||
### button_2x.lua ###
|
||||
|
||||
TA4 2x Button=
|
||||
@ -174,6 +184,7 @@ Momentary button or on/off switch=
|
||||
|
||||
### button_2x.lua ###
|
||||
### button_4x.lua ###
|
||||
### charge_detector.lua ###
|
||||
### player_detector.lua ###
|
||||
|
||||
Destination block number=
|
||||
@ -225,6 +236,14 @@ TA5 Ceramic Turbine=
|
||||
Dirt with Ash=
|
||||
TA1 Charcoal=
|
||||
|
||||
### charge_detector.lua ###
|
||||
|
||||
Command to send when the energy storage charge@nlevel falls below the specified switch point=
|
||||
Command to send when the energy storage charge@nlevel rises above the specified switch point=
|
||||
Storage charge level switch point=
|
||||
Switch point=
|
||||
TA4 Energy Storage Charge Detector=
|
||||
|
||||
### chest.lua ###
|
||||
|
||||
Allow public access to the chest=
|
||||
@ -249,6 +268,13 @@ Node numbers to read the states from=
|
||||
Send an event if state is equal or larger than=
|
||||
TA4 State Collector=
|
||||
|
||||
### command_converter.lua ###
|
||||
|
||||
Receive=
|
||||
Send delay (s)=
|
||||
Sent command=
|
||||
TA3 Command Converter=
|
||||
|
||||
### concentrator.lua ###
|
||||
|
||||
TA4 Tube Concentrator=
|
||||
@ -363,13 +389,20 @@ with door sound=
|
||||
### doorcontroller2.lua ###
|
||||
### flycontroller.lua ###
|
||||
### movecontroller.lua ###
|
||||
### node_detector.lua ###
|
||||
### turncontroller.lua ###
|
||||
|
||||
Done=
|
||||
Record=
|
||||
Recording...=
|
||||
block positions are stored.=
|
||||
|
||||
### doorcontroller2.lua ###
|
||||
### flycontroller.lua ###
|
||||
### movecontroller.lua ###
|
||||
### turncontroller.lua ###
|
||||
|
||||
Recording...=
|
||||
|
||||
### doorcontroller2.lua ###
|
||||
### movecontroller.lua ###
|
||||
|
||||
@ -478,6 +511,10 @@ TA3 Power Station Firebox=
|
||||
|
||||
Firebox=
|
||||
|
||||
### flipflop.lua ###
|
||||
|
||||
TA3 Flip-Flop=
|
||||
|
||||
### fly_lib.lua ###
|
||||
|
||||
Destination position is protected=
|
||||
@ -498,8 +535,10 @@ Error: Invalid path !!=
|
||||
|
||||
Error: Recording is missing !!=
|
||||
Flight route (A to B)=
|
||||
Move a player without moving blocks=
|
||||
See chat output=
|
||||
TA5 Fly Controller=
|
||||
Teleport mode=
|
||||
Test=
|
||||
[TA4 Fly Controller] Invalid path!=
|
||||
[TA4 Fly Controller] Recording is missing!=
|
||||
@ -520,11 +559,9 @@ Maximum speed for moving blocks=
|
||||
Move=
|
||||
Move A-B=
|
||||
Move B-A=
|
||||
Move a player without moving blocks=
|
||||
Move block height=
|
||||
Object offset=
|
||||
Stored=
|
||||
Teleport mode=
|
||||
Value in the range of 0.0 to 1.0=
|
||||
Y-offset for non-player objects like vehicles (-0.5 to 0.5)=
|
||||
|
||||
@ -595,6 +632,14 @@ TA5 Pipe=
|
||||
|
||||
TechAge Gate Block=
|
||||
|
||||
### gaze_sensor.lua ###
|
||||
|
||||
Command to send when sensor is no longer viewed=
|
||||
Command to send when sensor is viewed=
|
||||
Input the player name(s) separated by blanks.@nIf empty, only the owner is accepted.=
|
||||
Player Names=
|
||||
TA4 Gaze Sensor=
|
||||
|
||||
### gearbox.lua ###
|
||||
|
||||
TA2 Gearbox=
|
||||
@ -604,6 +649,7 @@ TA2 Gearbox=
|
||||
TA3 Generator=
|
||||
TA4 Generator=
|
||||
TA5 Generator=
|
||||
no steam=
|
||||
|
||||
### generator.lua ###
|
||||
### power_terminal2.lua ###
|
||||
@ -636,14 +682,6 @@ TA1 Mill Base=
|
||||
|
||||
TA4 LED Grow Light=
|
||||
|
||||
### guide.lua ###
|
||||
|
||||
No plan available=
|
||||
Plan=
|
||||
Sectional view=
|
||||
Side view=
|
||||
Top view=
|
||||
|
||||
### hammer.lua ###
|
||||
|
||||
TA1 Bronze Hammer (smash stone to gravel)=
|
||||
@ -664,9 +702,12 @@ TA5 Heat Exchanger 1=
|
||||
|
||||
### heatexchanger2.lua ###
|
||||
|
||||
Error!=
|
||||
Blue pipe connection error@n(@1 found / @2 expected)=
|
||||
Blue pipe coolant missing@n(@1 found / @2 expected)=
|
||||
Cooler error=
|
||||
Green pipe connection error@n(@1 found / @2 expected)=
|
||||
Green pipe coolant missing@n(@1 found / @2 expected)=
|
||||
Power network connection error=
|
||||
TA4 Heat Exchanger=
|
||||
TA4 Heat Exchanger 2=
|
||||
@ -929,8 +970,10 @@ TA4 Move Controller=
|
||||
|
||||
### node_detector.lua ###
|
||||
|
||||
Click on all blocks whose positions should be checked=
|
||||
Send signal if nodes have been:=
|
||||
TA3 Node Detector=
|
||||
TA4 Node Detector=
|
||||
added=
|
||||
added or removed=
|
||||
removed=
|
||||
@ -1302,6 +1345,10 @@ Refresh=
|
||||
TA1 Axle=
|
||||
TA1 Axle Bearing=
|
||||
|
||||
### ta2_clutch.lua ###
|
||||
|
||||
TA2 Clutch=
|
||||
|
||||
### ta2_weight_chest.lua ###
|
||||
|
||||
TA2 Weight Chest=
|
||||
|
@ -19,7 +19,34 @@ local NDEF = function(pos) return (minetest.registered_nodes[techage.get_node_lv
|
||||
|
||||
local logic = techage.logic
|
||||
|
||||
local WRENCH_MENU = {
|
||||
local WRENCH_MENU3 = {
|
||||
{
|
||||
type = "dropdown",
|
||||
choices = "switch,on button,button 1s,button 2s,button 4s,button 8s,button 16s,button 32s",
|
||||
name = "type",
|
||||
label = S("Type"),
|
||||
tooltip = S("Button or switch"),
|
||||
default = "1",
|
||||
},
|
||||
{
|
||||
type = "numbers",
|
||||
name = "numbers",
|
||||
label = S("Number"),
|
||||
tooltip = S("Destination block number(s)"),
|
||||
default = "",
|
||||
check = techage.check_numbers,
|
||||
},
|
||||
{
|
||||
type = "dropdown",
|
||||
choices = "private,protected,public",
|
||||
name = "access",
|
||||
label = S("Access"),
|
||||
tooltip = S("Button protection"),
|
||||
default = "1",
|
||||
},
|
||||
}
|
||||
|
||||
local WRENCH_MENU4 = {
|
||||
{
|
||||
type = "dropdown",
|
||||
choices = "switch,on button,button 1s,button 2s,button 4s,button 8s,button 16s,button 32s",
|
||||
@ -183,7 +210,7 @@ end
|
||||
local function ta_after_formspec(pos, fields, playername)
|
||||
store_fields_data(pos, fields)
|
||||
local meta = M(pos)
|
||||
if fields.decription ~= "" then
|
||||
if fields.decription and fields.decription ~= "" then
|
||||
logic.infotext(meta, fields.decription)
|
||||
else
|
||||
logic.infotext(meta, NDEF(pos).description)
|
||||
@ -255,6 +282,8 @@ minetest.register_node("techage:ta3_button_off", {
|
||||
meta:set_int("cycle_time", 0)
|
||||
end,
|
||||
|
||||
ta3_formspec = WRENCH_MENU3,
|
||||
ta_after_formspec = ta_after_formspec,
|
||||
on_receive_fields = on_receive_fields,
|
||||
on_rightclick = on_rightclick_on,
|
||||
techage_set_numbers = techage_set_numbers,
|
||||
@ -279,6 +308,8 @@ minetest.register_node("techage:ta3_button_on", {
|
||||
"techage_filling_ta3.png^techage_frame_ta3.png^techage_button_on.png",
|
||||
},
|
||||
|
||||
ta3_formspec = WRENCH_MENU3,
|
||||
ta_after_formspec = ta_after_formspec,
|
||||
on_rightclick = on_rightclick_off,
|
||||
on_timer = switch_off,
|
||||
on_rotate = screwdriver.disallow,
|
||||
@ -321,7 +352,7 @@ minetest.register_node("techage:ta4_button_off", {
|
||||
meta:set_int("cycle_time", 0)
|
||||
end,
|
||||
|
||||
ta4_formspec = WRENCH_MENU,
|
||||
ta4_formspec = WRENCH_MENU4,
|
||||
ta_after_formspec = ta_after_formspec,
|
||||
on_receive_fields = on_receive_fields,
|
||||
on_rightclick = on_rightclick_on,
|
||||
@ -359,7 +390,7 @@ minetest.register_node("techage:ta4_button_on", {
|
||||
},
|
||||
},
|
||||
|
||||
ta4_formspec = WRENCH_MENU,
|
||||
ta4_formspec = WRENCH_MENU4,
|
||||
ta_after_formspec = ta_after_formspec,
|
||||
on_rightclick = on_rightclick_off,
|
||||
on_timer = switch_off,
|
||||
|
232
techage/logic/charge_detector.lua
Normal file
@ -0,0 +1,232 @@
|
||||
--[[
|
||||
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019-2023 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
TA4 Energy storage charge detector
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local M = minetest.get_meta
|
||||
local S = techage.S
|
||||
local Cable = techage.ElectricCable
|
||||
local power = networks.power
|
||||
|
||||
local logic = techage.logic
|
||||
local CYCLE_TIME = 8
|
||||
local DESCR = S("TA4 Energy Storage Charge Detector")
|
||||
|
||||
local WRENCH_MENU = {
|
||||
{
|
||||
type = "numbers",
|
||||
name = "numbers",
|
||||
label = S("Number"),
|
||||
tooltip = S("Destination block number"),
|
||||
default = "",
|
||||
check = techage.check_numbers,
|
||||
},
|
||||
{
|
||||
type = "dropdown",
|
||||
choices = "10%,20%,30%,40%,50%,60%,70%,80%,90%",
|
||||
name = "switch_point",
|
||||
label = S("Switch point"),
|
||||
tooltip = S("Storage charge level switch point"),
|
||||
default = "50",
|
||||
values = {10, 20, 30, 40, 50, 60, 70, 80, 90}
|
||||
},
|
||||
{
|
||||
type = "ascii",
|
||||
name = "command1",
|
||||
label = '"<" ' .. S("Command"),
|
||||
tooltip = S("Command to send when the energy storage charge\nlevel falls below the specified switch point"),
|
||||
default = "off",
|
||||
},
|
||||
{
|
||||
type = "ascii",
|
||||
name = "command2",
|
||||
label = '">" ' .. S("Command"),
|
||||
tooltip = S("Command to send when the energy storage charge\nlevel rises above the specified switch point"),
|
||||
default = "on",
|
||||
},
|
||||
}
|
||||
|
||||
local function switch_on(pos)
|
||||
if logic.swap_node(pos, "techage:ta4_chargedetector_on") then
|
||||
logic.send_cmnd(pos, "command2", "on")
|
||||
end
|
||||
end
|
||||
|
||||
local function switch_off(pos)
|
||||
if logic.swap_node(pos, "techage:ta4_chargedetector_off") then
|
||||
logic.send_cmnd(pos, "command1", "off")
|
||||
end
|
||||
end
|
||||
|
||||
local function switch_point(pos)
|
||||
local mem = techage.get_mem(pos)
|
||||
if not mem.switch_point then
|
||||
mem.switch_point = tonumber(M(pos):get_string("switch_point")) or 50
|
||||
end
|
||||
return mem.switch_point
|
||||
end
|
||||
|
||||
local function above_switch_point(pos)
|
||||
local outdir = M(pos):get_int("outdir")
|
||||
local value = networks.power.get_storage_percent(pos, Cable, outdir)
|
||||
return value > switch_point(pos)
|
||||
end
|
||||
|
||||
local function techage_set_numbers(pos, numbers, player_name)
|
||||
local res = logic.set_numbers(pos, numbers, player_name, DESCR)
|
||||
return res
|
||||
end
|
||||
|
||||
local function after_dig_node(pos, oldnode, oldmetadata, digger)
|
||||
Cable:after_dig_node(pos)
|
||||
techage.remove_node(pos, oldnode, oldmetadata)
|
||||
techage.del_mem(pos)
|
||||
end
|
||||
|
||||
local function ta_after_formspec(pos, fields, playername)
|
||||
local mem = techage.get_mem(pos)
|
||||
mem.switch_point = nil
|
||||
end
|
||||
|
||||
minetest.register_node("techage:ta4_chargedetector_off", {
|
||||
description = DESCR,
|
||||
inventory_image = 'techage_charge_detector_inv.png',
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_smartline.png",
|
||||
"techage_smartline.png",
|
||||
"techage_smartline.png",
|
||||
"techage_smartline.png",
|
||||
"techage_smartline.png",
|
||||
"techage_smartline.png^techage_charge_detector_off.png",
|
||||
},
|
||||
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -6/32, -6/32, 14/32, 6/32, 6/32, 16/32},
|
||||
},
|
||||
},
|
||||
after_place_node = function(pos, placer)
|
||||
local meta = M(pos)
|
||||
logic.after_place_node(pos, placer, "techage:ta4_chargedetector_off", DESCR)
|
||||
logic.infotext(meta, DESCR)
|
||||
M(pos):set_int("outdir", networks.side_to_outdir(pos, "B"))
|
||||
Cable:after_place_node(pos)
|
||||
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
||||
end,
|
||||
|
||||
on_timer = function (pos, elapsed)
|
||||
if not above_switch_point(pos) then
|
||||
switch_on(pos)
|
||||
end
|
||||
return true
|
||||
end,
|
||||
|
||||
techage_set_numbers = techage_set_numbers,
|
||||
after_dig_node = after_dig_node,
|
||||
ta_after_formspec = ta_after_formspec,
|
||||
ta4_formspec = WRENCH_MENU,
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
paramtype2 = "facedir",
|
||||
groups = {choppy=2, cracky=2, crumbly=2},
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_node("techage:ta4_chargedetector_on", {
|
||||
description = DESCR,
|
||||
inventory_image = 'techage_charge_detector_inv.png',
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_smartline.png",
|
||||
"techage_smartline.png",
|
||||
"techage_smartline.png",
|
||||
"techage_smartline.png",
|
||||
"techage_smartline.png",
|
||||
"techage_smartline.png^techage_charge_detector_on.png",
|
||||
},
|
||||
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -6/32, -6/32, 14/32, 6/32, 6/32, 16/32},
|
||||
},
|
||||
},
|
||||
on_timer = function (pos, elapsed)
|
||||
if above_switch_point(pos) then
|
||||
switch_off(pos)
|
||||
end
|
||||
return true
|
||||
end,
|
||||
|
||||
techage_set_numbers = techage_set_numbers,
|
||||
after_dig_node = after_dig_node,
|
||||
ta_after_formspec = ta_after_formspec,
|
||||
ta4_formspec = WRENCH_MENU,
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
paramtype2 = "facedir",
|
||||
groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1},
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
drop = "techage:ta4_chargedetector_off"
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:ta4_chargedetector_off",
|
||||
recipe = {
|
||||
{"", "", ""},
|
||||
{"basic_materials:plastic_sheet", "dye:blue", "techage:aluminum"},
|
||||
{"techage:ta4_wlanchip", "techage:electric_cableS", "default:copper_ingot"},
|
||||
},
|
||||
})
|
||||
|
||||
techage.register_node({
|
||||
"techage:ta4_chargedetector_off", "techage:ta4_chargedetector_on"
|
||||
}, {
|
||||
on_recv_message = function(pos, src, topic, payload)
|
||||
if topic == "state" then
|
||||
local node = techage.get_node_lvm(pos)
|
||||
if node.name == "techage:ta4_chargedetector_on" then
|
||||
return "on"
|
||||
else
|
||||
return "off"
|
||||
end
|
||||
else
|
||||
return "unsupported"
|
||||
end
|
||||
end,
|
||||
on_beduino_request_data = function(pos, src, topic, payload)
|
||||
if topic == 142 then -- Binary State
|
||||
local node = techage.get_node_lvm(pos)
|
||||
if node.name == "techage:ta4_chargedetector_on" then
|
||||
return 0, {1}
|
||||
else
|
||||
return 0, {0}
|
||||
end
|
||||
else
|
||||
return 2, ""
|
||||
end
|
||||
end,
|
||||
on_node_load = function(pos)
|
||||
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
||||
end,
|
||||
}
|
||||
)
|
||||
|
||||
power.register_nodes({"techage:ta4_chargedetector_off", "techage:ta4_chargedetector_on"}, Cable, "con", {"B"})
|
||||
|
182
techage/logic/command_converter.lua
Normal file
@ -0,0 +1,182 @@
|
||||
--[[
|
||||
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2017-2023 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
TA3 Commannd Converter
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local M = minetest.get_meta
|
||||
local S = techage.S
|
||||
local DESCR = S("TA3 Command Converter")
|
||||
|
||||
local logic = techage.logic
|
||||
|
||||
local sDelay = "0,1,2,3,4,5,7,10,15,20,30,45,60"
|
||||
|
||||
local function switch_on(pos)
|
||||
logic.swap_node(pos, "techage:ta3_command_converter_on")
|
||||
logic.send_cmnd(pos, "command_on", "")
|
||||
end
|
||||
|
||||
local function switch_off(pos)
|
||||
logic.swap_node(pos, "techage:ta3_command_converter_off")
|
||||
logic.send_cmnd(pos, "command_off", "")
|
||||
end
|
||||
|
||||
local function formspec(meta)
|
||||
local numbers = meta:get_string("numbers") or ""
|
||||
local command_on = meta:get_string("command_on")
|
||||
local command_off = meta:get_string("command_off")
|
||||
local delay_on = techage.dropdown_index(sDelay, meta:get_string("delay_on"))
|
||||
local delay_off = techage.dropdown_index(sDelay, meta:get_string("delay_off"))
|
||||
|
||||
return "formspec_version[4]size[10,6]"..
|
||||
"box[0.2,0.2;9.6,0.6;#c6e8ff]" ..
|
||||
"label[0.4,0.5;" .. minetest.colorize( "#000000", DESCR) .. "]" ..
|
||||
|
||||
"field[1.0,1.5;8,0.6;numbers;" .. S("Insert destination node number(s)") .. ";" .. numbers .. "]" ..
|
||||
|
||||
"label[0.6,2.7;" .. S("Receive") .. "]" ..
|
||||
"label[2.8,2.7;" .. S("Sent command") .. "]" ..
|
||||
"label[7.34,2.7;" .. S("Send delay (s)") .. "]" ..
|
||||
|
||||
"box[0.5,3.1;1.2,0.6;#888]" ..
|
||||
"label[0.6,3.4;on]" ..
|
||||
"field[2.7,3.1;3.5,0.6;command_on;;" .. command_on .. "]" ..
|
||||
"dropdown[7.2,3.1;2,0.6;delay_on;" .. sDelay .. ";" .. delay_on .. ";false]" ..
|
||||
|
||||
"box[0.5,4.0;1.2,0.6;#888]" ..
|
||||
"label[0.6,4.3;off]" ..
|
||||
"field[2.7,4.0;3.5,0.6;command_off;;" .. command_off .. "]" ..
|
||||
"dropdown[7.2,4.0;2,0.6;delay_off;" .. sDelay .. ";" .. delay_off .. ";false]" ..
|
||||
|
||||
"button_exit[3.5,5.2;3,0.6;exit;" .. S("Save") .. "]"
|
||||
end
|
||||
|
||||
local function techage_set_numbers(pos, numbers, player_name)
|
||||
local meta = M(pos)
|
||||
local res = logic.set_numbers(pos, numbers, player_name, DESCR)
|
||||
meta:set_string("formspec", formspec(meta))
|
||||
return true --res
|
||||
end
|
||||
|
||||
local function after_dig_node(pos, oldnode, oldmetadata, digger)
|
||||
techage.remove_node(pos, oldnode, oldmetadata)
|
||||
techage.del_mem(pos)
|
||||
end
|
||||
|
||||
local function on_receive_fields(pos, formname, fields, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return
|
||||
end
|
||||
|
||||
local meta = minetest.get_meta(pos)
|
||||
if fields.exit and fields.exit ~= "" then
|
||||
if techage.check_numbers(fields.numbers, player:get_player_name()) then
|
||||
meta:set_string("numbers", fields.numbers)
|
||||
logic.infotext(M(pos), DESCR)
|
||||
end
|
||||
meta:set_string("command_on", fields.command_on)
|
||||
meta:set_string("command_off", fields.command_off)
|
||||
meta:set_int("delay_on", fields.delay_on or 0)
|
||||
meta:set_int("delay_off", fields.delay_off or 0)
|
||||
meta:set_string("formspec", formspec(meta))
|
||||
elseif fields.exit == "close" then
|
||||
meta:set_string("formspec", formspec(meta))
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("techage:ta3_command_converter_off", {
|
||||
description = DESCR,
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_filling_ta3.png^techage_frame_ta3_top.png",
|
||||
"techage_filling_ta3.png^techage_frame_ta3_top.png",
|
||||
"techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_command_converter.png",
|
||||
},
|
||||
after_place_node = function(pos, placer)
|
||||
local meta = M(pos)
|
||||
logic.after_place_node(pos, placer, "techage:ta3_command_converter_off", DESCR)
|
||||
logic.infotext(meta, DESCR)
|
||||
meta:set_string("formspec", formspec(meta))
|
||||
end,
|
||||
|
||||
on_timer = function (pos, elapsed)
|
||||
switch_on(pos)
|
||||
end,
|
||||
|
||||
on_receive_fields = on_receive_fields,
|
||||
techage_set_numbers = techage_set_numbers,
|
||||
after_dig_node = after_dig_node,
|
||||
paramtype2 = "facedir",
|
||||
groups = {choppy=2, cracky=2, crumbly=2},
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_node("techage:ta3_command_converter_on", {
|
||||
description = DESCR,
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_filling_ta3.png^techage_frame_ta3_top.png",
|
||||
"techage_filling_ta3.png^techage_frame_ta3_top.png",
|
||||
"techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_command_converter_on.png",
|
||||
},
|
||||
|
||||
on_timer = function (pos, elapsed)
|
||||
switch_off(pos)
|
||||
end,
|
||||
|
||||
on_receive_fields = on_receive_fields,
|
||||
techage_set_numbers = techage_set_numbers,
|
||||
after_dig_node = after_dig_node,
|
||||
paramtype2 = "facedir",
|
||||
groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1},
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
drop = "techage:ta3_command_converter_off"
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:ta3_command_converter_off",
|
||||
recipe = {
|
||||
{"", "group:wood", ""},
|
||||
{"default:mese_crystal_fragment", "default:copper_ingot", "techage:vacuum_tube"},
|
||||
{"", "group:wood", ""},
|
||||
},
|
||||
})
|
||||
|
||||
techage.register_node({
|
||||
"techage:ta3_command_converter_off", "techage:ta3_command_converter_on"
|
||||
}, {
|
||||
on_recv_message = function(pos, src, topic, payload)
|
||||
if topic == "on" then
|
||||
local delay = M(pos):get_int("delay_on") or 0
|
||||
if delay > 0 then
|
||||
minetest.get_node_timer(pos):start(delay)
|
||||
else
|
||||
switch_on(pos)
|
||||
end
|
||||
return true
|
||||
elseif topic == "off" then
|
||||
local delay = M(pos):get_int("delay_off") or 0
|
||||
if delay > 0 then
|
||||
minetest.get_node_timer(pos):start(delay)
|
||||
else
|
||||
switch_off(pos)
|
||||
end
|
||||
return true
|
||||
else
|
||||
return "unsupported"
|
||||
end
|
||||
end,
|
||||
}
|
||||
)
|