diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..818433e --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 0a652af..0000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# cvs-plugin - -#### Description -{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/apps/admin.js b/apps/admin.js new file mode 100644 index 0000000..625c9d9 --- /dev/null +++ b/apps/admin.js @@ -0,0 +1,196 @@ +import { segment } from "oicq"; +import fs from "fs"; +import lodash from "lodash"; +import { createRequire } from "module"; +import { exec } from "child_process"; +import { Cfg } from "../components/index.js"; +import Common from "../components/Common.js"; + + +const require = createRequire(import.meta.url); + +let cfgMap = { + "角色": "char.char", + "面板": "char.profile", + "老婆": "char.wife", + "查他人": "char.queryOther", + "图鉴": "wiki.wiki", + "图片": "wiki.pic", + "深渊": "wiki.abyss", + "渲染": "sys.scale", + "帮助": "sys.help", +}; +let sysCfgReg = `^#喵喵设置\s*(${lodash.keys(cfgMap).join("|")})?\s*(.*)$`; +export const rule = { + updateRes: { + hashMark: true, + reg: "^#图鉴更新$", + describe: "【#管理】更新素材", + }, + updateMiaoPlugin: { + hashMark: true, + reg: "^#图鉴(强制)?更新", + describe: "【#管理】图鉴更新", + }, + // sysCfg: { + // hashMark: true, + // reg: sysCfgReg, + // describe: "【#管理】系统设置" + // } +}; + + +const _path = process.cwd(); +const resPath = `${_path}/plugins/miao-plugin/resources/`; +const plusPath = `${resPath}/res-plus/`; + +const checkAuth = async function (e) { + return await e.checkAuth({ + auth: "master", + replyMsg: `只有主人才能命令喵喵哦~ + (*/ω\*)` + }); +} + +export async function sysCfg(e, { render }) { + if (!await checkAuth(e)) { + return true; + } + + let cfgReg = new RegExp(sysCfgReg); + let regRet = cfgReg.exec(e.msg); + + if (!regRet) { + return true; + } + + if (regRet[1]) { + // 设置模式 + let val = regRet[2] || ""; + + let cfgKey = cfgMap[regRet[1]]; + if (cfgKey === "sys.scale") { + val = Math.min(200, Math.max(50, val * 1 || 100)); + } else { + val = !/关闭/.test(val); + } + + if (cfgKey) { + Cfg.set(cfgKey, val); + } + } + + let cfg = { + chars: getStatus("char.char"), + profile: getStatus("char.profile"), + wife: getStatus("char.wife"), + other: getStatus("char.queryOther"), + wiki: getStatus("wiki.wiki"), + pic: getStatus("wiki.pic"), + abyss: getStatus("wiki.abyss"), + imgPlus: fs.existsSync(plusPath), + help: getStatus("sys.help", false), + scale: Cfg.get("sys.scale", 100) + } + + //渲染图像 + return await Common.render("admin/index", { + ...cfg, + }, { e, render, scale: 1.4 }); +} + +const getStatus = function (rote, def = true) { + if (Cfg.get(rote, def)) { + return `
已开启
`; + } else { + return `
已关闭
`; + } + +} + +export async function updateRes(e) { + if (!await checkAuth(e)) { + return true; + } + let command = ""; + if (fs.existsSync(`${resPath}/miao-res-plus/`)) { + e.reply("开始尝试更新,请耐心等待~"); + command = `git pull`; + exec(command, { cwd: `${resPath}/miao-res-plus/` }, function (error, stdout, stderr) { + //console.log(stdout); + if (/Already up to date/.test(stdout)) { + e.reply("目前所有图片都已经是最新了~"); + return true; + } + let numRet = /(\d*) files changed,/.exec(stdout); + if (numRet && numRet[1]) { + e.reply(`报告主人,更新成功,此次更新了${numRet[1]}个图片~`); + return true; + } + if (error) { + e.reply("更新失败!\nError code: " + error.code + "\n" + error.stack + "\n 请稍后重试。"); + } else { + e.reply("图片加量包更新成功~"); + } + }); + } else { + command = `git clone https://gitee.com/yoimiya-kokomi/miao-res-plus.git "${resPath}/miao-res-plus/"`; + e.reply("开始尝试安装图片加量包,可能会需要一段时间,请耐心等待~"); + exec(command, function (error, stdout, stderr) { + if (error) { + e.reply("角色图片加量包安装失败!\nError code: " + error.code + "\n" + error.stack + "\n 请稍后重试。"); + } else { + e.reply("角色图片加量包安装成功!您后续也可以通过 #喵喵更新图像 命令来更新图像"); + } + }); + } + return true; +} + +let timer; + +export async function updateMiaoPlugin(e) { + if (!await checkAuth(e)) { + return true; + } + let isForce = e.msg.includes("强制"); + let command = "git pull"; + if (isForce) { + command = "git checkout . && git pull"; + e.reply("正在执行强制更新操作,请稍等"); + } else { + e.reply("正在执行更新操作,请稍等"); + } + exec(command, { cwd: `${_path}/plugins/miao-plugin/` }, function (error, stdout, stderr) { + //console.log(stdout); + if (/Already up to date/.test(stdout)) { + e.reply("目前已经是最新版喵喵了~"); + return true; + } + if (error) { + e.reply("喵喵更新失败!\nError code: " + error.code + "\n" + error.stack + "\n 请稍后重试。"); + return true; + } + e.reply("喵喵更新成功,尝试重新启动Yunzai以应用更新..."); + timer && clearTimeout(timer); + redis.set("miao:restart-msg", JSON.stringify({ + msg: "重启成功,新版喵喵已经生效", + qq: e.user_id + }), { EX: 30 }); + timer = setTimeout(function () { + let command = "npm run restart"; + exec(command, function (error, stdout, stderr) { + if (error) { + if (/Yunzai not found/.test(error)) { + e.reply("自动重启失败,请手动重启以应用新版喵喵。请使用 npm run start 命令启动Yunzai-Bot"); + } else { + e.reply("重启失败!\nError code: " + error.code + "\n" + error.stack + "\n 请稍后重试。"); + } + return true; + } + }) + }, 1000); + + }); + return true; +} \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..6c9ee70 --- /dev/null +++ b/index.js @@ -0,0 +1,71 @@ +// import { +// character, +// getProfile, +// wife, +// wifeReg, +// enemyLv, +// getArtis, +// getProfileAll, +// profileHelp +// } from "./apps/character.js"; +// import { consStat, abyssPct, abyssTeam } from "./apps/stat.js"; +// import { wiki, calendar } from "./apps/wiki.js"; +// import { help, versionInfo } from "./apps/help.js"; +// import lodash from "lodash"; +// import common from "../../lib/common.js"; +// import { rule as adminRule, updateRes, sysCfg, updateMiaoPlugin } from "./apps/admin.js"; +// import { currentVersion } from "./components/Changelog.js"; + +// export { +// character, +// wife, +// consStat, +// abyssPct, +// abyssTeam, +// wiki, +// updateRes, +// updateMiaoPlugin, +// sysCfg, +// help, +// versionInfo, +// getProfile, +// enemyLv, +// getArtis, +// getProfileAll, +// profileHelp, +// calendar +// }; + + +// let rule = { +// versionInfo: { +// reg: "^#图鉴版本$", +// describe: "【#帮助】 喵喵版本介绍", +// }, +// calendar: { +// reg: "^#图鉴列表$", +// describe: "【#日历】 活动日历", +// }, +// ...adminRule +// }; + +// lodash.forEach(rule, (r) => { +// r.priority = r.priority || 50; +// r.prehash = true; +// r.hashMark = true; +// }); + +// export { rule }; + +// console.log(`图鉴${currentVersion}初始化~`); + +// setTimeout(async function () { +// let msgStr = await redis.get("miao:restart-msg"); +// if (msgStr) { +// let msg = JSON.parse(msgStr); +// await common.relpyPrivate(msg.qq, msg.msg); +// await redis.del("miao:restart-msg"); +// let msgs = [`当前版本: ${currentVersion}`, `您可使用 #版本 命令查看更新信息`]; +// await common.relpyPrivate(msg.qq, msgs.join("\n")); +// } +// }, 1000); \ No newline at end of file diff --git a/tools/char-data-sprider.js b/tools/char-data-sprider.js new file mode 100644 index 0000000..635c26a --- /dev/null +++ b/tools/char-data-sprider.js @@ -0,0 +1,280 @@ +import fs from "fs"; +import cheerio from "cheerio"; +import lodash from "lodash"; +import fetch from "node-fetch"; +import {roleId, abbr} from "../../../config/genshin/roleId.js"; + +const _path = process.cwd(); +let roleIdMap = {}; +lodash.forEach(roleId, (names, id) => { + roleIdMap[names[0]] = id; +}); + +function getBasic($, name) { + let ret = {} + + if (name) { + ret.name = name; + } else { + // 采集基础信息 + ret.name = $("#scroll_card_item").next("table").find("tr:first td:eq(1)").text(); + } + ret.abbr = abbr[ret.name] || ret.name; + ret.id = roleIdMap[ret.name] || ''; + + let basic = $(".data_cont_wrapper table:first"); + let title = function (title) { + return basic.find(`td:contains('${title}')`).next("td").text(); + } + ret.title = title("Title"); + ret.star = basic.find(`td:contains('Rarity')`).next("td").find(".sea_char_stars_wrap").length; + let elem = basic.find(`td:contains('Element')`).next("td").find("img").attr("data-src"); + + let elemRet = /\/([^\/]*)_35/.exec(elem); + if (elemRet) { + ret.elem = elemRet[1]; + } + + ret.allegiance = title("Allegiance"); + ret.weapon = title("Weapon Type"); + ret.britydah = title("Birthday"); + ret.astro = title("Astrolabe Name"); + ret.cncv = title("Chinese Seiyuu"); + ret.jpcv = title("Japanese Seiyuu"); + ret.desc = title("In-game Description"); + return ret; +} + +function getStat($) { + // 采集属性信息 + let stat = $("#beta_scroll_stat").next(".skilldmgwrapper").find("table"); + let attrs = [], idx = 4; + stat.find("tr:first td:gt(0)").each(function (i) { + let title = $(this).text(); + if (title === "Ascension") { + idx = i + 1; + console.log(idx); + return false; + } + attrs.push($(this).text()) + }) + let lvs = [], lvStat = {}; + stat.find("tr:gt(0)").each(function (i) { + let tr = $(this), lvl = tr.find("td:first").text(); + lvs.push(lvl); + let data = []; + tr.find(`td:lt(${idx})`).each(function (i) { + if (i > 0) { + data.push($(this).text()) + } + }) + lvStat[lvl] = data; + }); + return { + lvs, + stat: attrs, + detail: lvStat + }; +} + +function getTalents($, eq, onlyLv1 = false) { + let root = $("#beta_scroll_attack_talent"); + let info = root.nextAll(`.item_main_table:eq(${eq})`); + + let name = info.find("tr:first td:eq(1)").text(); + let icon = info.find("tr:first td:first img").attr("data-src"); + + // 说明 + let desc = info.find("tr:eq(1) td div.skill_desc_layout").html(); + desc = desc.replace(/]*>/g, ""); + desc = desc.replace(/<\/color=[^>]*>/g, ""); + desc = desc.replace(/]*>/g, ""); + desc = desc.replace(/<\/span>/g, ""); + desc = desc.split("
"); + lodash.forEach(desc, (txt, i) => { + desc[i] = lodash.trim(txt); + }) + + // detail + let detail = root.nextAll(`.skilldmgwrapper:eq(${eq})`).find("table"); + let lvs = [], details = []; + detail.find("tr:first td").each(function (i) { + if (onlyLv1 && i > 1) { + return false; + } + if (i > 0) { + lvs.push($(this).text()) + } + }); + detail.find("tr:gt(0)").each(function () { + let name = $(this).find("td:eq(0)").text(); + let values = [], isSame = true; + $(this).find("td:gt(0)").each(function (i) { + if (onlyLv1 && i > 0) { + return false; + } + let val = lodash.trim($(this).text()); + values.push(val); + if (i > 0 && values[0] !== val) { + isSame = false; + } + }); + + details.push({ + name, isSame, values + }) + }); + + return { + name, + icon, + desc, + tables: details, + lvs + } + +} + +let getPassive = function ($, name) { + let table = $("#beta_scroll_passive_talent").next("table") + let ret = []; + + + table.find("tr").each(function (idx) { + if (idx % 2 === 0) { + let ds = {}; + ds.icon = $(this).find("td:first img").attr("data-src"); + ds.name = $(this).find("td:eq(1)").text(); + ret[idx / 2] = ds; + } else { + ret[(idx - 1) / 2].desc = $(this).find("td").text(); + } + }) + if (name === "莫娜" || name === "神里绫华") { + ret.push(getTalents($, 2, true)) + } + return ret; +} + +let getCons = function ($) { + let table = $("#beta_scroll_constellation").next("table") + let ret = {}; + table.find("tr").each(function (idx) { + if (idx % 2 === 0) { + let ds = {}; + ds.icon = $(this).find("td:first img").attr("data-src"); + ds.name = $(this).find("td:eq(1)").text(); + ret[idx / 2 + 1] = ds; + } else { + ret[(idx + 1) / 2].desc = $(this).find("td").text(); + } + }) + return ret; +} + +let getImgs = function ($) { + let cont = $("#scroll_gallery").next(".homepage_index_cont"); + let img = function (idx, _cont) { + return (_cont || cont).find(`.gallery_content_cont:eq(${idx}) a`).attr("href"); + } + let card = $("#scroll_name_card").nextAll(".homepage_index_cont:first"); + return { + face: img(0), + side: img(1), + gacha_card: img(2), + gacha_splash: img(3), + profile: img(1, card), + party: img(2, card), + char: $("#live_data table.item_main_table:first td:first img").attr("data-src") + } +} + +let getCharData = async function (url, key, name = '') { + + url = "https://genshin.honeyhunterworld.com/" + url; + console.log('req' + key, url) + + let req = await fetch(url); + let txt = await req.text(); + + const $ = cheerio.load(txt); + let ret = getBasic($, name); + + name = ret.name; + + ret.lvStat = getStat($); + ret.talent = { + a: getTalents($, 0), + e: getTalents($, 1), + q: getTalents($, name === "莫娜" || name === "神里绫华" ? 3 : 2) + } + ret.passive = getPassive($, name); + ret.cons = getCons($); + ret.imgs = getImgs($); + return ret; +} + +async function saveCharData(url, key, name) { + + let data = await getCharData(url, key, name); + + name = name || data.name; + + if(!name){ + console.log("角色名不存在"+url); + return ; + } + + let charPath = `${_path}/plugins/miao-plugin/resources/meta/character/${data.name}/` + if (!fs.existsSync(charPath)) { + fs.mkdirSync(charPath); + } + + fs.writeFileSync(`${charPath}data.json`, JSON.stringify(data, "", "\t")); + console.log(data.name + "下载完成"); +} + +async function down() { + // const url = "https://genshin.honeyhunterworld.com/db/char/characters/?lang=CHS"; + const url = "https://genshin.honeyhunterworld.com/db/char/unreleased-and-upcoming-characters/?lang=CHS"; + let req = await fetch(url); + let txt = await req.text(); + let $ = cheerio.load(txt); + let char = $(".char_sea_cont"); + + char.each(async function () { + let url = $(this).find("a:first").attr("href"); + let keyRet = /\/char\/(\w*)\//.exec(url); + + + if (keyRet && keyRet[1]) { + let key = keyRet[1], + tRet = /traveler_(girl|boy)_(\w*)/.exec(key), + name; + + if (tRet) { + if (tRet[1] === "girl") { + name = {anemo: "风", geo: "岩", electro: "雷"}[tRet[2]] + "主"; + } else { + return + } + } + if (key === "heizo") { + name = "鹿野院平藏" + } + + await saveCharData(url, key, name); + } + }); + +} + +//await saveCharData("https://genshin.honeyhunterworld.com/db/char/ayaka/?lang=CHS", "ayaka"); + + +await down(); + + + + + diff --git a/tools/char-img-download.js b/tools/char-img-download.js new file mode 100644 index 0000000..3d15b06 --- /dev/null +++ b/tools/char-img-download.js @@ -0,0 +1,96 @@ +import {Data} from "../components/index.js"; +import lodash from "lodash"; +import fs from "fs"; +import request from "request"; + +const _root = process.cwd() + "/plugins/miao-plugin/"; +const _cRoot = _root + "resources/meta/character/"; + + +let readDir = fs.readdirSync(_cRoot); +console.log(readDir); + +let imgs = []; + +function img(char, url, target) { + imgs.push({ + url, + file: `${char.name}/${target}` + }) +} + + +lodash.forEach(readDir, (c) => { + + console.log(c); + + if (!fs.existsSync(`${_cRoot}/${c}/data.json`)) { + return; + } + + let char = Data.readJSON(`${_cRoot}/${c}/`, 'data.json'); + + if (char.name) { + // 正面 + + // 角色条 + img(char, char.imgs.profile, "profile.png"); + // 名片 + img(char, char.imgs.party, "party.png"); + // img(char, char.imgs.char, "char.png"); + // 立绘-竖版 + img(char, char.imgs.gacha_card, "gacha_card.png"); + // 立绘 + img(char, char.imgs.gacha_splash, "gacha_splash.png"); + // 正面像 + img(char, char.imgs.face, "face.png"); + img(char, char.imgs.side, "face.png"); + + // 天赋 + if (char.talent) { + img(char, char.talent.a.icon, "talent_a.png"); + img(char, char.talent.e.icon, "talent_e.png"); + img(char, char.talent.q.icon, "talent_q.png"); + } + // 被动天赋 + lodash.forEach(char.passive, (p, idx) => { + img(char, p.icon, `passive_${idx}.png`); + }); + + // 命座 + lodash.forEach(char.cons, (con, idx) => { + img(char, con.icon, `cons_${idx}.png`) + }); + + } +}) + +let cacheFile = async function () { + + let cacheFn = async function (file) { + if (fs.existsSync(`${_cRoot}/${file.file}`)) { + console.log(`已存在,跳过 ${file.file}`); + return true; + } + + try { + let stream = fs.createWriteStream(`${_cRoot}/${file.file}`); + await request("https://genshin.honeyhunterworld.com/" + file.url).pipe(stream); + + return new Promise((resolve) => { + stream.on('finish', resolve) + }); + } catch (e) { + return false; + } + console.log(`下载成功: ${file.file}`); + return true; + }; + + console.log('开始下载'); + await Data.asyncPool(5, imgs, cacheFn); + +} + +await cacheFile(); +console.log('下载成功'); diff --git a/tools/char-init.js b/tools/char-init.js new file mode 100644 index 0000000..2dcac8c --- /dev/null +++ b/tools/char-init.js @@ -0,0 +1,148 @@ +import Data from "../components/Data.js"; +import lodash from "lodash"; +import { Character } from "../components/models.js"; +import fs from "fs"; + +import { roleId, abbr } from "../../../config/genshin/roleId.js"; + +let roleIdMap = {}; +lodash.forEach(roleId, (names, id) => { + roleIdMap[names[0]] = id; +}) + +let _root = process.cwd(); +let characterMeta = Data.readJSON("./plugins/miao-plugin/components/meta", "characters.json"); +let characters = {}; +let pathName = process.cwd() + "/plugins/miao-plugin/resources/meta/character/"; + +// 获取指定角色的Meta信息 +const getMetaData = function (name) { + if (!characterMeta[name]) { + return {}; + } + const metaCfg = { lowerFirstKey: true }, + meta = characterMeta[name]; + + // 处理基础信息 + let ret = Data.getData(meta, "Name,Key,Title,desc:Description,astro:AstrolabeName", metaCfg); + + ret.star = /4star/.test(meta.Star) ? 4 : 5; + + let weaponid = /s_(\d*).png$/.exec(meta.Weapon); + if (weaponid) { + ret.weapon = { + 233101: "长柄武器", + 33101: "单手剑", + 43101: "法器", + 163101: "双手剑", + 213101: "弓" + }[weaponid[1]] + } + + + // 处理图像信息 + //ret.img = Data.getData(meta, "Weapon,Element,City,Profile,GachaCard,GachaSplash,Source", metaCfg); + + // 处理元素 + let elemRet = /([^\/]*).png$/.exec(meta.Element); + console.log(elemRet[1]); + if (elemRet && elemRet[1]) { + ret.elem = elemRet[1]; + ret.element = elemName[ret.elem]; + } + + // 处理属性 + ret.stat = Data.getData(meta, "hp:BaseHP,atk:BaseATK,def:BaseDEF,growStat:AscensionStat,growValue:AscensionStatValue", metaCfg); + ret.lvStat = lodash.map(meta.CharStat, (d) => Data.getData(d, "Name,Values", metaCfg)); + + if (/Mende/.test(meta.City)) { + ret.city = "蒙德" + } else if (/Liyue/.test(meta.City)) { + ret.city = "璃月"; + } else if (/Daoqi/.test(meta.City)) { + ret.city = "稻妻"; + } + + // 处理材料 + let itemKey = lodash.map("talent,boss,gemStone,Local,monster,weekly".split(","), (a) => `${a}:${lodash.upperFirst(a)}.Name`); + ret.item = Data.getData(meta, itemKey, metaCfg) + + // 处理天赋 + ret.talent = { + a: getTalentData(meta.NormalAttack), + e: getTalentData(meta.TalentE), + q: getTalentData(meta.TalentQ), + }; + + // 处理其他天赋 + ret.passive = lodash.map(meta.PassiveTalents, (d) => Data.getData(d, "Name,desc:Description", metaCfg)) + + // 处理命座信息 + let cons = {}; + lodash.forEach(meta.Constellation, (data, key) => { + cons[key.replace("Constellation", "")] = Data.getData(data, "Name,desc:Description", metaCfg); + }) + ret.cons = cons; + return ret; +} + +// 获取Meta中的天赋信息 +const getTalentData = function (data) { + let ret = Data.getData(data, "Name,desc:Description", { lowerFirstKey: true }); + let attr = [], table = [], tableKeys; + + lodash.forEach(data.Table, (tr) => { + let tmp = { name: tr.Name }, isTable = true, isDef = false, lastVal; + + // 检查当前行是否是表格数据 + lodash.forEach(tr.Values, (v) => { + // 如果为空则退出循环 + if (v === "") { + isTable = false; + return false; + } + + if (typeof (lastVal) === "undefined") { + // 设定初始值 + lastVal = v; + } else if (lastVal != v) { + // 如果与初始值不一样,则标记退出循环 + isDef = true; + return false; + } + }); + + if (isTable && isDef) { + if (!tableKeys) { + tableKeys = lodash.keys(tr.Values); + } + tmp.value = lodash.map(tableKeys, (k) => tr.Values[k]) + table.push(tmp); + } else { + tmp.value = lastVal; + attr.push(tmp) + } + }) + ret.attr = attr; + ret.table = table; + ret.tableKeys = tableKeys; + return ret; +} + +lodash.forEach(characterMeta, (c) => { + let meta = Character.getMetaData(c.Name); + let data = { + id: roleIdMap[meta.name], + key: meta.key, + name: meta.name, + abbr: abbr[meta.name] || meta.name, + city: meta.city + }; + lodash.defaults(data, meta) + Data.createDir(pathName, data.name) + fs.writeFileSync(`${pathName}${data.name}/data.json`, JSON.stringify(data, "", "\t")); + characters[data.id] = { id: data.id, key: data.key, name: meta.name }; + +}) + +fs.writeFileSync(`${pathName}index.json`, JSON.stringify(characters, "", "\t")); diff --git a/tools/test.txt b/tools/test.txt new file mode 100644 index 0000000..a328f06 --- /dev/null +++ b/tools/test.txt @@ -0,0 +1,35 @@ + 夜兰 | Honey Impact - Genshin Impact DB and Tools

Return to char

Character #54

LiveBeta
Title兰生幽谷
Allegiance岩上茶室
Rarity
Weapon TypeBow
Element
Birthday20 April
Astrolabe Name幽客座
Chinese Seiyuu???
Japanese Seiyuu???
English Seiyuu???
Korean Seiyuu???
In-game Description测试角色
Table of Contents
Stats
Stats
Attack Talents
Talents Material
Passive Talents
Constellations
Ascension Rewards
NameCard
Card Item
Specific Food
Gallery
Combat Sounds
Quotes
Stories
Comments
Stat Progression
Lv基础生命值基础攻击力基础防御力暴击率暴击伤害AscensionTotal
1112519435%50%
202918491115%50%
20+3883661475%50%
405810982205%50%
40+64951102469.8%50%
5074721262839.8%50%
50+838614231814.6%50%
60937415835514.6%50%
60+1005917038114.6%50%
701105618741914.6%50%
70+1174119844519.4%50%
801274921548319.4%50%
80+1343422750924.2%50%
901445024454824.2%50%
Attack Talents
普通攻击·潜形隐曜弓
普通攻击
进行至多四段的连续弓箭射击。
重击
进行伤害更高、更为精准的瞄准射击。
瞄准时,流水会在箭矢上持续积聚。聚满了激流的箭矢会造成水元素伤害。
破局
脱离战斗状态5秒后,夜兰将获得「破局」状态,使下一次满蓄力瞄准射击所需的蓄力时间减少80%,并将在满蓄力时转为发射「破局矢」。破局矢将基于夜兰的生命值上限造成水元素范围伤害。
下落攻击
从空中射出箭雨,并迅速下坠冲击地面,在落地时造成范围伤害。
Lv1Lv2Lv3Lv4Lv5Lv6Lv7Lv8Lv9Lv10Lv11Lv12Lv13Lv14Lv15
一段伤害 40.68% 43.99% 47.3% 52.03% 55.34% 59.13% 64.33% 69.53% 74.73% 80.41% 86.09% 91.76% 97.44% 103.11% 108.79%
二段伤害 39.04% 42.22% 45.4% 49.94% 53.12% 56.75% 61.74% 66.74% 71.73% 77.18% 82.63% 88.08% 93.52% 98.97% 104.42%
三段伤害 51.6% 55.8% 60% 66% 70.2% 75% 81.6% 88.2% 94.8% 102% 109.2% 116.4% 123.6% 130.8% 138%
四段伤害 21.67% *3 23.44% *3 25.2% *3 27.72% *3 29.48% *3 31.5% *3 34.27% *3 37.04% *3 39.82% *3 42.84% *3 45.86% *3 48.89% *3 51.91% *3 54.94% *3 57.96% *3
瞄准射击 43.86% 47.43% 51% 56.1% 59.67% 63.75% 69.36% 74.97% 80.58% 86.7% 92.82% 98.94% 105.06% 111.18% 117.3%
满蓄力瞄准射击 124% 133.3% 142.6% 155% 164.3% 173.6% 186% 198.4% 210.8% 223.2% 235.6% 248% 263.5% 279% 294.5%
破局矢伤害 11.58% 生命值上限 12.44% 生命值上限 13.31% 生命值上限 14.47% 生命值上限 15.34% 生命值上限 16.21% 生命值上限 17.36% 生命值上限 18.52% 生命值上限 19.68% 生命值上限 20.84% 生命值上限 21.99% 生命值上限 23.15% 生命值上限 24.6% 生命值上限 26.05% 生命值上限 27.49% 生命值上限
下坠期间伤害 56.83% 61.45% 66.08% 72.69% 77.31% 82.6% 89.87% 97.14% 104.41% 112.34% 120.27% 128.2% 136.12% 144.05% 151.98%
低空/高空坠地冲击伤害 113.63% / 141.93% 122.88% / 153.49% 132.13% / 165.04% 145.35% / 181.54% 154.59% / 193.1% 165.17% / 206.3% 179.7% / 224.45% 194.23% / 242.61% 208.77% / 260.76% 224.62% / 280.57% 240.48% / 300.37% 256.34% / 320.18% 272.19% / 339.98% 288.05% / 359.79% 303.9% / 379.59%
萦络纵命索
牵引「络命丝」疾走,缠络标记途径的敌人。
疾走结束时,「络命丝」将会爆发,基于夜兰的生命值上限,对标记的敌人造成水元素伤害。
点按
快速向前疾走一段距离。
长按
持续疾走。
期间,夜兰可以控制冲刺的方向,并能通过再次施放技能,提前结束疾走状态。
此外,「络命丝」爆发时,依照标记敌人的数量,夜兰将有概率获得「破局」状态:每个标记的敌人能使概率提升34%。
直到她钩指扯线,恶党贼寇之辈、阴谋诡计之徒才会发现,自己已是在劫难逃。
Lv1Lv2Lv3Lv4Lv5Lv6Lv7Lv8Lv9Lv10Lv11Lv12Lv13Lv14Lv15
技能伤害 22.61% 生命值上限 24.31% 生命值上限 26.01% 生命值上限 28.27% 生命值上限 29.96% 生命值上限 31.66% 生命值上限 33.92% 生命值上限 36.18% 生命值上限 38.44% 生命值上限 40.7% 生命值上限 42.97% 生命值上限 45.23% 生命值上限 48.05% 生命值上限 50.88% 生命值上限 53.71% 生命值上限
长按最大持续时间 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒 3 秒
冷却时间 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒 10 秒
渊图玲珑骰
造成水元素范围伤害,并凝聚出「玄掷玲珑」,协助进行战斗。
玄掷玲珑
将跟随角色,并在以下情况下,进行协同攻击,基于夜兰的生命值上限造成水元素伤害:
• 队伍中自己的当前场上角色进行普通攻击时,每1秒至多触发一次;
• 夜兰自己的「络命丝」爆发并命中敌人时,将进行一次协同攻击。
「嗜赌可不行哦。作为大庄家,我拿比大小来比喻一下吧。你用一个骰子,怎么赢得过我的七个骰子呢?」
Lv1Lv2Lv3Lv4Lv5Lv6Lv7Lv8Lv9Lv10Lv11Lv12Lv13Lv14Lv15
技能伤害 7.31% 生命值上限 7.86% 生命值上限 8.4% 生命值上限 9.14% 生命值上限 9.68% 生命值上限 10.23% 生命值上限 10.96% 生命值上限 11.69% 生命值上限 12.42% 生命值上限 13.15% 生命值上限 13.89% 生命值上限 14.62% 生命值上限 15.53% 生命值上限 16.44% 生命值上限 17.36% 生命值上限
玄掷玲珑伤害 4.87% 生命值上限*3 5.24% 生命值上限*3 5.6% 生命值上限*3 6.09% 生命值上限*3 6.46% 生命值上限*3 6.82% 生命值上限*3 7.31% 生命值上限*3 7.8% 生命值上限*3 8.28% 生命值上限*3 8.77% 生命值上限*3 9.26% 生命值上限*3 9.74% 生命值上限*3 10.35% 生命值上限*3 10.96% 生命值上限*3 11.57% 生命值上限*3
持续时间 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒 15 秒
冷却时间 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒 18 秒
元素能量 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70
Talent Ascension Materials (Single Talent)Talent Ascension Materials (All 3 Talents lvl 10)
Passive Talents
长考一着
在璃月执行时长为20小时的探索派遣任务时,获得的奖励增加25%。
猜先有方
队伍存在1/2/3/4种元素类型的角色时,夜兰的生命值上限提升6%/12%/18%/30%。
妙转随心
「玄掷玲珑」存在期间,能使队伍中自己的当前场上角色造成的伤害提高1%,并且每1秒进一步提高3.5%,至多使角色造成的伤害提高50%。
Constellations
与谋者,以局入局
萦络纵命索的可使用次数增加1次。
入彀者,多多益善
「玄掷玲珑」协同攻击时,会发射一枚额外的水箭,造成相当于夜兰生命值上限20%的水元素伤害。
该效果每2.8秒至多触发一次。
坐庄者,三仙戏法
萦络纵命索的技能等级提高3级。
至多提升至15级。
诓惑者,接树移花
依照「络命丝」标记敌人的数量,每次标记将在爆发时使队伍中所有角色的生命值上限提升10%,持续25秒。通过这种方式,生命值上限至多获得40%提升。
晃盅者,琼畟药骰
渊图玲珑骰的技能等级提高3级。
至多提升至15级。
取胜者,大小通吃
施放渊图玲珑骰后,夜兰将进入「运筹帷幄」状态:
夜兰的普通攻击将转为发射较强的「破局矢」。这种箭矢具有「破局矢」原本的特性,造成的伤害视为重击伤害,能造成原本130%伤害。
「运筹帷幄」状态至多持续20秒,将在夜兰发射6枚箭矢后移除。
Ascension Rewards
AscensionReward
1
3
5
NameCard
夜兰·一掷
TypeNamecard Style
Rarity
In-game Slang
In-game Description
名片纹饰。
「做骰子本来就难得公平。做工糙一点的骰子,不同点数掏空的重量肯定会不一样。」
Card Item
夜兰
Rarity
In-game Slang角色解锁
In-game Description
夜兰个人描述
Specific Food
沾露虾仁
TypeSpecial Dish
Original Food清炒虾仁
Rarity
Effect队伍中所有角色护盾强效提升35%,持续300秒。多人游戏时,仅对自己的角色生效。
In-game Slang食物
In-game Description
夜兰的特色料理。食材选用的是由翘英庄送到茶室的新茶沾露,配合现捕的河虾快速炒制。观之,色泽雅丽;闻之,茶香幽远;尝之,软嫩弹牙…等等,她怎么又端了个辣椒碟上来?
Obtained from recipe
夜兰
+
虾仁
x 4+
面粉
x 3+
金鱼草
x 3
Character Gallery
Quotes
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
???
???
Audio LanguageEnglishJapaneseChineseKorean
Audio Response
Stories
???
???
???
???
???
???
???
???

1,220 comments

Skip to comment form

    • Lortite on 7 April 2022 at 3:28 pm
    • Reply

    Yelan is already 2x better than Xingqiu reasons:

    Yelan: passive dmg, self buff, 50% dmg buff, main while dps is on cd, crit ascension.

    Xingqiu: passive dmg, great er, atk ascension, heal.

    (aa goodluck yelan wanters

    • yerboy on 7 April 2022 at 2:22 pm
    • Reply

    im gonna play tartaglia, xingqiu, yelan, shinobu and I DONT CARE IM GONNA HAVE FUN

    • Minty Fair on 7 April 2022 at 12:39 pm
    • Reply

    Omg, they buff Yelan and now she gets 4 particles on her e everytime unlike before where there is a chance that it will be either 3-4 particles. Yelan wanters unite 😀

    • Nerf Bennet please on 7 April 2022 at 12:28 pm
    • Reply

    Yelan is much better than Xinqiu C6? What? Do not agree? I have C6 Xinqiu, dmg is suck, only become hydro applier, his Artifacts and sword are so busy looking for ER. Which is Yelan using her HP as her dmg and bow can do buff to party, cost just 70, with short CD. 😛

    • Thank me later on 7 April 2022 at 12:03 pm
    • Reply

    If you care so much about what TC says, then uninstall Genshin Impact and play the game on your goddamn Microsoft Excel. Lol

    • Pray for yelan on 7 April 2022 at 11:12 am
    • Reply

    People seems to be confused with why xinqiu’s hydro application is miles ahead of yelan even though both have the same ICD limitation, so let me explain using hutao case.

    Xinqiu’s rainsword goes from 2 rainswords to 3 rainswords to 5 rainswords. So, following the standard ICD of 3 hits/2.5s, that’s: (I = hydro application, O = no application)
    1st NA: IO + orbital (NA+CA vape)
    2nd NA: OIO (CA vape)
    3rd NA: OIOOI (CA vape + blossom vape)
    4th NA: IO + orbital <= 2.5s refresh (NA+CA vape)
    5th NA: OIO (CA vape)
    6th NA: OIOOI (CA vape)

    With yelan (taken from beta test result) it usually goes like this:
    1st NA: IOO (NA+CA vape)
    2nd NA: IOO (CA vape)
    3rd NA: IOO (CA vape, blossom apply pyro aura)
    4th NA: IOO (yelan forward vape, hutao perform 3NA, 1st NA apply pyro aura)
    5th NA: IOO (yelan forward vape)
    6th NA: IOO (yelan apply hydro, hutao CA vape)

    Legends: NA = normal attack, CA = charged attack
    3NA = 3 normal attack strings

    See the main difference? With xinqiu, hutao can infinitely perform 1NA-CA-jump/dash cancel combo and will reverse vape all of her CA. With yelan, hutao need to do 3x 1NA-CA followed by 3NA-CA then repeat to allow her to reverse vape all of her CA. Doable, but a huge pain in the arse. Do keep in mind that the 3NA-CA hutao does must be delayed to accommodate for yelan’s proc CD, which is another layer of pain.
    With zhongli in the team, you’ll need to run away before creating any pillar. With albedo in the team, good luck.
    So, demand buff, don’t overhype. We want yelan strong, not clunky. Thank you for your attention.

    • yelan mommy on 7 April 2022 at 10:39 am
    • Reply

    yelan is perfect for a yoimiya with yunjin because she can increase yunjin’s NA buff’s as well with her 2nd passive! yoimiya’s burst doesn’t snapshot means yelan’s 2nd passive can gradually increase yoimiya’s burst dmg. hutao is also a good partner for yelan because of her high atk stat even though yelan might not be as strong of a hydro applicator as c6 xinqui for hutao vape!
    sadly xiangling can’t utilize this 2nd passive in the national team because of snapshotting problem : (

    • Yelan wanter on 7 April 2022 at 10:39 am
    • Reply

    Here’s my list of recommend stuff for Yelan:

    Weapons:
    3* Slingshot – 31.2% CRT.R | | 60% stronger CA in a close distance (pretty ez to obtain in all banners)
    3* Recurve Bow – 46.9% HP | | 8%~16% HP restoration upon defeating an enemy (chests in Mondstat or Nakano, located in Ritou, Inazuma)
    The Stringless – 165 EM | | 24-48% dmg increase to E’s and Q’s damage (standart banner)
    Favonius Warbow – 61.3% ER | | 3 extra particles every 12s~6s (everyone has it lol)
    Sarcificial Bow – 30.6% ER | | 40%~80% E’s cooldown reset every 32s~16s !!!very refiment hungry!!! (standart banner)
    Fading Twilight – 30.6% ER | | 12%/20%/28% more damage dealt (F2P bow from Chasm event ig)
    Elegy for the End – 55.1% ER + 60~120 EM | | 100~200 EM + 20%~40% ATK team buff for 12s every 20s (limited banner)
    Aqua Simulacra – 88.2% CRT.D + 16%~32% HP | | 20%~40% more dmg dealt in close range, even when off-field (limited banner)

    Artifacts:
    Noblesse Oblige – Q’s dmg increase | | team’s ATK buff, might be good in teams without Bennet
    2 Piece: Elemental Burst DMG +20%
    4 Piece: Using an Elemental Burst increases all party members’ ATK by 20% for 12s.
    Heart od Depth – hydro dmg bonus | | CA buff (better to use at C1/C6)
    2 Piece: Hydro DMG Bonus +15%
    4 Piece: After using Elemental Skill, increases Normal Attack and Charged Attack DMG by 30% for 15s
    Emblem of Severed Fate – ER bonus | | Q’s damage increase
    2 Piece: Energy Recharge +20%
    4 Piece: Increases Elemental Burst DMG by 25% of Energy Recharge. A maximum of 75% bonus DMG can be obtained in this way.
    Tenacity of the Millelith – core stat bonus
    2 Piece: HP increased by 20%

    In terms of stats we need 50:100 CRITs in circlet, ER sands (around 200% for smooth rorations) and hydro or HP% goblet

    Teammates:
    ||Other cases||
    Ayato×
    Kokomi×
    Hu Tao×
    Yoimiya
    Yanfei
    Diluc
    Bennet×
    Thoma×
    Raiden
    Keqing (×Primodal Jade Cutter)
    Beidou (×C1 or/and The Bell)
    Ayaka (×Primodal Jade Cutter)
    Aloy
    Diona×
    Zhongli×
    || × – recommended with C4||

    Well, this list might be not viable due to changes in beta, but i really wanted to share my opinion ~_~

    • Cannon on 7 April 2022 at 8:54 am
    • Reply

    “shes dps loss if you put her on Rational because of her short duration of burst compare to Xingqui” Huh? Her burst lasts 15sec just like Xingqui, only hers hits every second.

    • Jhacks on 7 April 2022 at 8:33 am
    • Reply

    Finally, I can bench water boi for my abyss team forever.

    • giga on 7 April 2022 at 8:22 am
    • Reply

    she seriously need a buff to her dmg bonus passive because it literally instead of giving you full buff right away it just avg the buff of on 30% so instead of 3.5% increase a 8.5% increase would be better so when she is in the middle of her ult the buff is full

    • .. on 7 April 2022 at 7:10 am
    • Reply

    I have but 1 question

    I know of Rational, or Raiden National. But do people actually call it “Baalcional”? It’s such a shit name tbh

    • weed cringe on 7 April 2022 at 7:09 am
    • Reply

    Her bday is 4/20.

    Instapull.

    • Andybersal on 7 April 2022 at 4:31 am
    • Reply

    I like Hoyoverse is releasing new characters that need old weekly boss materials and one of their actual nation on top of that. That also makes me wonder, Why does Hoyoverse even bother making new weekly bosses if only 4-5 characters are going to need their materials anyways?

    • Artifacts suck on 7 April 2022 at 4:24 am
    • Reply

    I hate farming Dmg% goblet. So damn rare and when I get one, it’s either shit or off set (still shit) that requires me to switch my good same-set artifact pieces.

    • Lmao on 7 April 2022 at 4:15 am
    • Reply

    Genshin’s hardest content nowaday is easy af for 1 year old/midbie player, I don’t even care about new characters’ power level, Hoyoverse will make sure of it for us. What players nowadays truly pay attention to is whether the character is FUN and suit their taste or not, next is the ability to coordinate new teams. Every character will have a gameplay issue and experienced players will know right away what to do to fix it, simple as that. For new players, Just enjoy the content learn gradually about game machinist, consider and choose for yourself whatever character you want to pull, don’t let one-sided judgments from anonymous theorycrafters influence your pulling decision. Nothing can go wrong matter what

      • Aish on 7 April 2022 at 8:39 am
      • Reply

      I totally agree.

      Unfortunately, there are still some people who dont understand this.

      • nosetplayer on 7 April 2022 at 9:53 am
      • Reply

      And here I am, who had been playing since two weeks after the game launched, and could only get 33 stars at the best

      • ofc on 7 April 2022 at 12:40 pm
      • Reply

      THIS

    • Angry C3 Xingqiu on 7 April 2022 at 3:46 am
    • Reply

    People here comparing Xingqiu C6 to Yelan C0. Yes it is good to compare but don’t say it like it is easy to get C6 Xingqiu than Yelan because here I am with my Xingqiu C3. It took me two years to play the game to get Xingqiu to C4 and those are because of the two Liyue events where you can get a free 4 star character in Liyue and the upcoming Inazuma event that can get my Xingqiu to C4. If you want to complain at least help us get our Xingqiu to C6 first and no I am not F2P I am a dolphin that is hoping to get Xingqiu to C6 but cannot because everytime I try to pull on Xingqiu on his banners I always get the other two characters >:( at least Yelan is guaranteed at 160 pulls and I am gonna pull for her since it will take me a long time to get Xingqiu to C6 and at least I can always use the Sacrificial bow on her like Xingqiu and build ER% on her. A

      • Not the first time on 7 April 2022 at 8:41 am
      • Reply

      I understand your point.
      Its the same that they did for Yae Miko by comparing her to c6 fishcl. Apparently they think its easy to c6 a 4 star, which isnt true.

      • MHY WHY on 7 April 2022 at 1:47 pm
      • Reply

      got c6 XQ in early 2021 (Klee+Ganyu banners + Paimon shop + CN NY free 4-star)
      stopped used him, as he is just too OP to my tastes
      I dont mind characters with OP damage output, but C6 XQ entire kit is OP
      Constellations are better then good half of limited 5-stars constellations…
      all those “LeVel 70 oNly 4-sTaRs” poser showcases were carried by him (and Benny in other half)

      • Genshin moment on 7 April 2022 at 1:52 pm
      • Reply

      People are already comparing her c2 with Xingqiu c6.

    • Hmmm on 7 April 2022 at 3:08 am
    • Reply

    Does she only have 1 idle animation? Based on leaks we’ve seen she only does that 1 animation where her dices randomly changes its number. I hope she has 2 different idles like every other chars

      • someone on 7 April 2022 at 11:26 am
      • Reply

      she has another one where she looks at her bracelet and touches it

      • pudding on 7 April 2022 at 12:45 pm
      • Reply

      no, she also adjusts her bracelet in one of her idles :p

      • the guy who smocking some crack on 7 April 2022 at 1:11 pm
      • Reply

      no she also checks her bracelet thing

      • Koltreit on 7 April 2022 at 1:31 pm
      • Reply

      They usually make two for new characters but some just had one at first and then got another one in the next version. That may happen to her, I don’t think a 5star will end up with only one animation.

      • .. on 7 April 2022 at 1:40 pm
      • Reply

      She has another one where she takes off her bracelet and puts it on again

      • yourlocalbennymain on 7 April 2022 at 3:35 pm
      • Reply

      She does! Her animation where she rolls the dice is the same it’s just the dice that changes. I kinda hoped that she would have a different reaction for the numbers she got. Like if she got a 1 she would be disappointed. Her other idle i’m pretty sure is her checking out her bracelet.

    • helloworld on 7 April 2022 at 2:32 am
    • Reply

    I wonder how the damage buff would be calculated with c6 Raiden -5s burst.

    • Idk on 7 April 2022 at 1:20 am
    • Reply

    is she even worth making a SUB/DPS at c0?

    • Reverse powecreep is worse as powercreep!!! wtf Hoyoverse? on 7 April 2022 at 12:29 am
    • Reply

    WTF hoyoverse so scared of powercreeping a 4 star. Jeez just powercreep Xingqui already, im tired of using his ugly ass. TC says shes dps loss if you put her on Rational because of her short duration of burst compare to Xingqui that his burst tha last until last rotation. Also,Yelan cant compete on Xingqui c6 hydro application on Hutao. She cant vaporize Hutao’s charged attack as often as c6 Xingqui.

      • talkingtoamoron on 7 April 2022 at 9:31 am
      • Reply

      dude… you are either troll or dumb. She is a powercreep to xingiu, she does hydro application the same, she is stronger support for hu tao. Also she has longer duration and shorter colldown than xingiu, the f*** are you talking about??

      • xinqui best boy on 7 April 2022 at 10:18 am
      • Reply

      yeah kinda sad i guess yelan will be more suitable for yoimiya at c0.

      • Hmmm on 7 April 2022 at 12:32 pm
      • Reply

      Yeah, I think so. I mean based of rarity, 5* should be stronger than 4*, but yeah this is my reason why I’m never excited for new character because I’m meta slave

    • KK310 on 6 April 2022 at 11:38 pm
    • Reply

    Would Yanfei be the biggest benefactor aside from Hutao? She doesn’t snapshot so can also benefit from the YL’s 50% DMG passive buff
    Since Yanfei’s pyro application is too fast for XQ alone, go double hydro with YF – XQ – YL – Bennett.
    Either this will end up with YF being the driver and reverse vaping for XQ and YL; or the two hydros will provide YF with 100% vape coverage and provide insane sub-DPS. Either way I expect this team to reach Rational/Hutao level of DPS.

    Happy to hear other thoughts

      • yep on 7 April 2022 at 12:46 pm
      • Reply

      You’re right with the Yanfei point

      Besides, I don’t think she improves Hutao as much as many think. xiao/diluc/klee or ayaka can take advantage of that buff dmg more efficiently than hutao imo, since they can be onfield the 15 s, instead of the Hutao’s 9 secs

      • Ayoooyo on 7 April 2022 at 1:43 pm
      • Reply

      >Since Yanfei’s pyro application is too fast for XQ alone
      Do you actually even play the game?

Leave a Reply

Your e-mail address will not be published.

\ No newline at end of file