Showing preview only (5,517K chars total). Download the full file or copy to clipboard to get everything.
Repository: InertSteak/Pokermon
Branch: main
Commit: 162d96d74785
Files: 136
Total size: 5.0 MB
Directory structure:
gitextract_9tj2e7bi/
├── .gitignore
├── LICENSE
├── Pokermon.json
├── README.md
├── assets/
│ ├── shaders/
│ │ ├── booster.fs
│ │ ├── evolution.fs
│ │ ├── shiny.fs
│ │ └── zorua.fs
│ └── sounds/
│ ├── chomp.ogg
│ ├── e_shiny.ogg
│ ├── energy_use.ogg
│ ├── ludicolo.ogg
│ ├── miror_b_music.ogg
│ ├── pocket_music_high.ogg
│ ├── pocket_music_high_knockoff.ogg
│ ├── pocket_music_low.ogg
│ ├── seed_1.ogg
│ ├── seed_2.ogg
│ ├── seed_3.ogg
│ ├── seed_4.ogg
│ ├── seed_5.ogg
│ └── voltorb_flip_music.ogg
├── backs/
│ └── backs1.lua
├── blinds/
│ └── pokebossblind.lua
├── boosters/
│ └── packs1.lua
├── challenges/
│ └── pokechallenges.lua
├── config.lua
├── consumable types/
│ └── type1.lua
├── consumables/
│ ├── 00_mart_balls.lua
│ ├── 01_mart_energy.lua
│ ├── 02_mart_spectral.lua
│ ├── 03_mart_items.lua
│ ├── 04_mart_rare.lua
│ ├── 05_mart_specific.lua
│ ├── 06_mart_berry.lua
│ ├── 07_mart_jirachi.lua
│ └── 08_mart_machine.lua
├── editions/
│ └── editions1.lua
├── enhancements/
│ └── enhancement1.lua
├── functions/
│ ├── apifunctions.lua
│ ├── debufffunctions.lua
│ ├── dex_order.lua
│ ├── displaycard.lua
│ ├── energizable_vanilla.lua
│ ├── energyfunctions.lua
│ ├── inputmanager.lua
│ ├── jokerdisplayfunctions.lua
│ ├── pokecompat.lua
│ ├── pokeconstants.lua
│ ├── pokedraw.lua
│ ├── pokefamily.lua
│ ├── pokefunctions.lua
│ ├── pokespriteload.lua
│ ├── pokeutils.lua
│ └── uifunctions.lua
├── jokerdisplay/
│ ├── definitions1.lua
│ ├── definitions2.lua
│ ├── definitions3.lua
│ ├── definitions4.lua
│ ├── definitions5.lua
│ ├── definitions6.lua
│ ├── definitions7.lua
│ ├── definitions8.lua
│ ├── definitions9.lua
│ └── definitionsOther.lua
├── localization/
│ ├── de.lua
│ ├── en-us.lua
│ ├── es_419.lua
│ ├── es_ES.lua
│ ├── fr.lua
│ ├── id.lua
│ ├── it.lua
│ ├── ja.lua
│ ├── ko.lua
│ ├── nl.lua
│ ├── pl.lua
│ ├── pt_BR.lua
│ ├── ru.lua
│ ├── vi.lua
│ ├── zh_CN.lua
│ └── zh_TW.lua
├── lovely/
│ ├── UI.toml
│ ├── controller_support.toml
│ ├── daily_challenge.toml
│ ├── draw_card.toml
│ ├── gameplay_functions.toml
│ ├── poke_utils.toml
│ └── start_up.toml
├── pokemon/
│ ├── pokejokers_01.lua
│ ├── pokejokers_02.lua
│ ├── pokejokers_03.lua
│ ├── pokejokers_04.lua
│ ├── pokejokers_05.lua
│ ├── pokejokers_06.lua
│ ├── pokejokers_07.lua
│ ├── pokejokers_08.lua
│ ├── pokejokers_09.lua
│ ├── pokejokers_10.lua
│ ├── pokejokers_11.lua
│ ├── pokejokers_12.lua
│ ├── pokejokers_13.lua
│ ├── pokejokers_14.lua
│ ├── pokejokers_15.lua
│ ├── pokejokers_16.lua
│ ├── pokejokers_17.lua
│ ├── pokejokers_18.lua
│ ├── pokejokers_19.lua
│ ├── pokejokers_20.lua
│ ├── pokejokers_21.lua
│ ├── pokejokers_22.lua
│ ├── pokejokers_23.lua
│ ├── pokejokers_24.lua
│ ├── pokejokers_25.lua
│ ├── pokejokers_26.lua
│ ├── pokejokers_27.lua
│ ├── pokejokers_28.lua
│ ├── pokejokers_29.lua
│ ├── pokejokers_30.lua
│ ├── pokejokers_31.lua
│ ├── pokejokers_32.lua
│ ├── pokejokers_33.lua
│ ├── pokejokers_34.lua
│ ├── pokejokers_35.lua
│ ├── zmissingno.lua
│ ├── zotherjokers.lua
│ └── zzzapril_fools.lua
├── pokequips.lua
├── pokermon.lua
├── pokesprites.lua
├── pokeui.lua
├── seals/
│ └── seals1.lua
├── setup.lua
├── sleeves/
│ └── sleeve.lua
├── stickers/
│ └── stickers.lua
├── tags/
│ └── tags1.lua
└── vouchers/
└── pokevouchers.lua
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
.vscode/
sync.ffs_db
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 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 General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
================================================
FILE: Pokermon.json
================================================
{
"id": "Pokermon",
"name": "Pokermon",
"author": ["InertSteak", "Please See Credits Page"],
"description": "A full content Balatro mod where every joker is a Pokemon.",
"prefix": "poke",
"icon_path": "icon.png",
"main_file": "pokermon.lua",
"priority": -1,
"badge_colour": "ED533A",
"badge_text_colour": "FFFFFF",
"display_name": "Pokermon",
"version": "3.7.0-0506b",
"dependencies": [
"Steamodded (>=1.0.0~BETA-1620a)",
"Lovely (>=0.9)"
],
"conflicts": [],
"provides": [],
"dump_loc": false
}
================================================
FILE: README.md
================================================
# Important
If you're having trouble loading the mod, try turning off Pixel Smoothing. This can *significantly* reduce the amount of loading needed.
# Pokermon
Huge thank you to [Lovely](https://github.com/ethangreen-dev/lovely-injector), [Steamodded](https://github.com/Steamopollys/Steamodded), [Cryptid](https://github.com/MathIsFun0/Cryptid) and [Betmma](https://github.com/betmma/my_balatro_mods)!
This mod and its features would not be possible otherwise. Additonaly thank you to everyone who helps with the project, please check out the credits tab on the mod menu!
We now have a discord server [here](https://discord.gg/AptX86Qsyz)! Please report any to bugs or issues me so I can hopefully fix them and feel free to make suggestions or contribute to the mod.
Please use the latest code before repoting issues, the releases may be out of date with the current code.
Pokermon is a full content mod for Balatro, adding content based on Pokémon. There are now 439+ Jokers that have been added alongside many other custom additions.
There is also an option to only play with Pokemon Jokers if you want to focus on the new content. (Option defaults to on)

**Prerequisites:**
Both [Lovely](https://github.com/ethangreen-dev/lovely-injector) (use latest release if you can, some things may be broken on earlier versions) and [Steamodded](https://github.com/Steamopollys/Steamodded) (use latest release) must be installed.
**Installation:**
1. Download the zip file with the contents of the repository. (Code -> Download Zip)\
2. Create a folder named Pokermon inside your mods folder.
3. Extract the zip file into the mods folder. Make sure that there is a single folder between the mods folder and the contents. (Ie it should go `Mods\Pokermon\contents` and not `Mods\Pokermon\Pokermon\contents` or `Mods\contents`, where contents are the inner files)
4. Make sure the files are directly under the Pokermon folder in your mods folder and not under the zip file folder.
(In other words, unzip the file and then copy and paste the assests, config.lua, pokermon.lua, etc to be under the Pokermon folder in the mods folder)
**Roadmap:**
- Implementation of every Gen III Pokémon, as well as features and mechanics based on the generation
- More Boss Blinds based on evil teams
- Field/Route mechanic for the shop to help you find specific Pokémon jokers
- Weather-based mechanics
- A new edition?
- More custom art by our amazing artists!
**Card Images:**
Guests artists are welcome! Want your art in the game? Join our [Discord](https://discord.gg/AptX86Qsyz)! We have a section where you can submit your custom sprites, check up our guidelines, seek tutorials on Balatro art, and even pixel art too! We have templates and palettes available as resources, and a talented and caring community!
Not only will your art be credited in-game, we have a section in our credits reserved for our guest artists! There, players can not only view an artist's sprites they've made to the mod gallery-style, but also view and visit any links to social media profiles or websites you'd like to share!
Our current goal is to have custom sprites for every Pokémon in the National Dex!
**Credits**
This mod wouldn't be possible without the hard work of the many contributors. The below credits are viewable in game as well.

================================================
FILE: assets/shaders/booster.fs
================================================
// === GLSL Fix Log ===
// 修复时间: Mon Jul 21 14:15:41 CST 2025
// 文件来源: booster.fs
// 共修改 1 行
// 第 96 行:"return transform_projection * vertex_position + vec4(0,0,0,scale);" → "return transform_projection * vertex_position + vec4(0.0,0.0,0.0,scale);"
// =====================
#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH)
#define MY_HIGHP_OR_MEDIUMP highp
#else
#define MY_HIGHP_OR_MEDIUMP mediump
#endif
extern MY_HIGHP_OR_MEDIUMP vec2 booster;
extern MY_HIGHP_OR_MEDIUMP number dissolve;
extern MY_HIGHP_OR_MEDIUMP number time;
extern MY_HIGHP_OR_MEDIUMP vec4 texture_details;
extern MY_HIGHP_OR_MEDIUMP vec2 image_details;
extern bool shadow;
extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1;
extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2;
vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv)
{
if (dissolve < 0.001) {
return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a);
}
MY_HIGHP_OR_MEDIUMP float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values
MY_HIGHP_OR_MEDIUMP float t = time * 10.0 + 2003.;
MY_HIGHP_OR_MEDIUMP vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a);
MY_HIGHP_OR_MEDIUMP vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a);
MY_HIGHP_OR_MEDIUMP vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324));
MY_HIGHP_OR_MEDIUMP vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532));
MY_HIGHP_OR_MEDIUMP vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000));
MY_HIGHP_OR_MEDIUMP float field = (1.+ (
cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) +
cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.;
MY_HIGHP_OR_MEDIUMP vec2 borders = vec2(0.2, 0.8);
MY_HIGHP_OR_MEDIUMP float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14))
- (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve);
if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) {
if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) {
tex.rgba = burn_colour_1.rgba;
} else if (burn_colour_2.a > 0.01) {
tex.rgba = burn_colour_2.rgba;
}
}
return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0);
}
vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords )
{
MY_HIGHP_OR_MEDIUMP vec4 tex = Texel( texture, texture_coords);
MY_HIGHP_OR_MEDIUMP vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba;
MY_HIGHP_OR_MEDIUMP number low = min(tex.r, min(tex.g, tex.b));
MY_HIGHP_OR_MEDIUMP number high = max(tex.r, max(tex.g, tex.b));
MY_HIGHP_OR_MEDIUMP number delta = max(high-low, low*0.7);
MY_HIGHP_OR_MEDIUMP number fac = 0.8 + 0.9*sin(13.*uv.x+5.32*uv.y + booster.r*12. + cos(booster.r*5.3 + uv.y*4.2 - uv.x*4.));
MY_HIGHP_OR_MEDIUMP number fac2 = 0.5 + 0.5*sin(10.*uv.x+2.32*uv.y + booster.r*5. - cos(booster.r*2.3 + uv.x*8.2));
MY_HIGHP_OR_MEDIUMP number fac3 = 0.5 + 0.5*sin(12.*uv.x+6.32*uv.y + booster.r*6.111 + sin(booster.r*5.3 + uv.y*3.2));
MY_HIGHP_OR_MEDIUMP number fac4 = 0.5 + 0.5*sin(4.*uv.x+2.32*uv.y + booster.r*8.111 + sin(booster.r*1.3 + uv.y*13.2));
MY_HIGHP_OR_MEDIUMP number fac5 = sin(0.5*16.*uv.x+5.32*uv.y + booster.r*12. + cos(booster.r*5.3 + uv.y*4.2 - uv.x*4.));
MY_HIGHP_OR_MEDIUMP number maxfac = 0.6*max(max(fac, max(fac2, max(fac3,0.0))) + (fac+fac2+fac3*fac4), 0.);
tex.rgb = tex.rgb*0.5 + vec3(0.4, 0.4, 0.8);
tex.r = tex.r-delta + delta*maxfac*(0.7 + fac5*0.07) - 0.1;
tex.g = tex.g-delta + delta*maxfac*(0.7 - fac5*0.17) - 0.1;
tex.b = tex.b-delta + delta*maxfac*0.7 - 0.1;
tex.a = tex.a*(0.8*max(min(1., max(0.,0.3*max(low*0.2, delta)+ min(max(maxfac*0.1,0.), 0.4)) ), 0.) + 0.15*maxfac*(0.1+delta));
return dissolve_mask(tex*colour, texture_coords, uv);
}
extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos;
extern MY_HIGHP_OR_MEDIUMP float hovering;
extern MY_HIGHP_OR_MEDIUMP float screen_scale;
#ifdef VERTEX
vec4 position( mat4 transform_projection, vec4 vertex_position )
{
if (hovering <= 0.){
return transform_projection * vertex_position;
}
MY_HIGHP_OR_MEDIUMP float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy);
MY_HIGHP_OR_MEDIUMP vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale;
MY_HIGHP_OR_MEDIUMP float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist);
return transform_projection * vertex_position + vec4(0.0,0.0,0.0,scale);
}
#endif
================================================
FILE: assets/shaders/evolution.fs
================================================
// === GLSL Fix Log ===
// 修复时间: Mon Jul 21 14:15:41 CST 2025
// 文件来源: evolution.fs
// 共修改 3 行
// 第 125 行:"number new_b = sin(2.*(evolution.b - 0.75) * 3.14159265359 / 3.)/5;" → "number new_b = sin(2.*(evolution.b - 0.75) * 3.14159265359 / 3.)/5.0;"
// 第 126 行:"new_b = new_b * (1+sin(angle*3.14159265359 * 5 + evolution.g)/30+cos(angle*3.14159265359 * 2 + evolution.g)/30);" → "new_b = new_b * (1.0+sin(angle*3.14159265359 * 5.0 + evolution.g)/30.0+cos(angle*3.14159265359 * 2.0 + evolution.g)/30.0);"
// 第 159 行:"return transform_projection * vertex_position + vec4(0,0,0,scale);" → "return transform_projection * vertex_position + vec4(0.0,0.0,0.0,scale);"
// =====================
#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH)
#define MY_HIGHP_OR_MEDIUMP highp
#else
#define MY_HIGHP_OR_MEDIUMP mediump
#endif
extern MY_HIGHP_OR_MEDIUMP vec3 evolution;
extern MY_HIGHP_OR_MEDIUMP number dissolve;
extern MY_HIGHP_OR_MEDIUMP number time;
extern MY_HIGHP_OR_MEDIUMP vec4 texture_details;
extern MY_HIGHP_OR_MEDIUMP vec2 image_details;
extern bool shadow;
extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1;
extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2;
vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv)
{
if (dissolve < 0.001) {
return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a);
}
float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values
float t = time * 10.0 + 2003.;
vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a);
vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a);
vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324));
vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532));
vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000));
float field = (1.+ (
cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) +
cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.;
vec2 borders = vec2(0.2, 0.8);
float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14))
- (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve);
if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) {
if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) {
tex.rgba = burn_colour_1.rgba;
} else if (burn_colour_2.a > 0.01) {
tex.rgba = burn_colour_2.rgba;
}
}
return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0);
}
number hue(number s, number t, number h)
{
number hs = mod(h, 1.)*6.;
if (hs < 1.) return (t-s) * hs + s;
if (hs < 3.) return t;
if (hs < 4.) return (t-s) * (4.-hs) + s;
return s;
}
vec4 RGB(vec4 c)
{
if (c.y == 0.)
return vec4(vec3(c.z), c.a);
number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z);
number s = 2.0 * c.z - t;
return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w);
}
vec4 HSL(vec4 c)
{
number low = min(c.r, min(c.g, c.b));
number high = max(c.r, max(c.g, c.b));
number delta = high - low;
number sum = high+low;
vec4 hsl = vec4(.0, .0, .5 * sum, c.a);
if (delta == .0)
return hsl;
hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum);
if (high == c.r)
hsl.x = (c.g - c.b) / delta;
else if (high == c.g)
hsl.x = (c.b - c.r) / delta + 2.0;
else
hsl.x = (c.r - c.g) / delta + 4.0;
hsl.x = mod(hsl.x / 6., 1.);
return hsl;
}
vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords )
{
vec4 tex = Texel(texture, texture_coords);
vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba;
vec2 adjusted_uv = uv - vec2(0.5, 0.5);
adjusted_uv.x = adjusted_uv.x*texture_details.b/texture_details.a;
vec2 rotater = vec2(0.,1.);
number angle = acos(dot(rotater, adjusted_uv)/(length(rotater)*length(adjusted_uv)));
number add_mod = abs(0.39269908169 - mod(angle, 0.78539816339));
number bg_color = evolution.g * 0.1 + 2.*length(adjusted_uv) - (add_mod / 5.) - 0.5*(1.5 - evolution.b);
bg_color = abs(bg_color - floor(bg_color + 0.5)) + 0.515;
bg_color = floor(bg_color * 15.) / 15.;
number mid_hid = (1.-length(adjusted_uv)) - evolution.b * 5. * length(adjusted_uv);
mid_hid = 13. * (evolution.b + 0.5) * length(adjusted_uv) - 2./(0.5+evolution.b);
if (evolution.b > 1.5)
mid_hid = min(1.,mid_hid) - (evolution.b - 1.75) * 2. - 10. * (evolution.b - 1.5) * length(adjusted_uv);
else
mid_hid = mid_hid - 0.1/length(adjusted_uv);
vec4 hsl_evo = HSL(vec4(0.,0.,0.,1.));
hsl_evo.r = evolution.g / 3.;
hsl_evo.g = 0.4;
hsl_evo.b = sqrt(min(1., max(0., bg_color)));
if (evolution.b > 0.75)
{
number new_b = sin(2.*(evolution.b - 0.75) * 3.14159265359 / 3.)/5.0;
new_b = new_b * (1.0+sin(angle*3.14159265359 * 5.0 + evolution.g)/30.0+cos(angle*3.14159265359 * 2.0 + evolution.g)/30.0);
new_b = new_b / length(adjusted_uv);
new_b = new_b * new_b * new_b * new_b - 0.2;
new_b = new_b * min(1., max(0., evolution.b * 2. - 1.5));
hsl_evo.g = min(1., hsl_evo.g + new_b);
hsl_evo.b = min(1., hsl_evo.b + new_b);
mid_hid = min(1., max(0., max(mid_hid, new_b)));
if (evolution.b > 1.75)
mid_hid = mid_hid * min(1., max(0., 4.5 - evolution.b*2.));
}
hsl_evo = RGB(hsl_evo);
hsl_evo.a = min(tex.a, mid_hid);
tex = hsl_evo;
return dissolve_mask(tex*colour, texture_coords, uv);
}
extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos;
extern MY_HIGHP_OR_MEDIUMP float hovering;
extern MY_HIGHP_OR_MEDIUMP float screen_scale;
#ifdef VERTEX
vec4 position( mat4 transform_projection, vec4 vertex_position )
{
if (hovering <= 0.){
return transform_projection * vertex_position;
}
float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy);
vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale;
float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist);
return transform_projection * vertex_position + vec4(0.0,0.0,0.0,scale);
}
#endif
================================================
FILE: assets/shaders/shiny.fs
================================================
// === GLSL Fix Log ===
// 修复时间: Mon Jul 21 14:15:41 CST 2025
// 文件来源: shiny.fs
// 共修改 23 行
// 第 41 行:"return 1 / (1 + exp(6-8*x)) - 0.005;" → "return 1.0 / (1.0 + exp(6.0-8.0*x)) - 0.005;"
// 第 46 行:"return 1 - pow(sin(M_PI/2 * x),20);" → "return 1.0 - pow(sin(M_PI/2.0 * x),20.0);"
// 第 68 行:"number time_val = shiny.g + time + 7777;" → "number time_val = shiny.g + time + 7777.0;"
// 第 69 行:"vec2 newCenter = vec2(0,0);" → "vec2 newCenter = vec2(0.0,0.0);"
// 第 70 行:"for (int i = 4; i < 8; i += 1)" → "for (float i = 4.0; i < 8.0; i += 1.0)"
// 第 76 行:"number angle = 2 * M_PI * stackoverflow_hash(hash, 1);" → "number angle = 2.0 * M_PI * stackoverflow_hash(hash, 1.0);"
// 第 77 行:"number dist = 0.1 + 0.3 * stackoverflow_hash(hash, 2);" → "number dist = 0.1 + 0.3 * stackoverflow_hash(hash, 2.0);"
// 第 81 行:"number size = sin(iter * M_PI) * (sqrt(i) / 3) * (0.05 + 0.2 * stackoverflow_hash(hash, 3));" → "number size = sin(iter * M_PI) * (sqrt(i) / 3.0) * (0.05 + 0.2 * stackoverflow_hash(hash, 3.0));"
// 第 83 行:"float star_angle = atan(adjusted_uv.x, adjusted_uv.y) + sin(shiny.r + time + M_PI * stackoverflow_hash(hash, 4));" → "float star_angle = atan(adjusted_uv.x, adjusted_uv.y) + sin(shiny.r + time + M_PI * stackoverflow_hash(hash, 4.0));"
// 第 84 行:"float star = size * 0.2 / cos(asin(cos(5*star_angle))/10 + 0.942477796077);" → "float star = size * 0.2 / cos(asin(cos(5.0*star_angle))/10.0 + 0.942477796077);"
// 第 88 行:"hsl.a = opacity + prev_opacity * (1 - opacity);" → "hsl.a = opacity + prev_opacity * (1.0 - opacity);"
// 第 89 行:"hsl.b = (0.3 * stackoverflow_hash(hash, 9) + 0.6) * (opacity / hsl.a) + (hsl.b * prev_opacity / hsl.a);" → "hsl.b = (0.3 * stackoverflow_hash(hash, 9.0) + 0.6) * (opacity / hsl.a) + (hsl.b * prev_opacity / hsl.a);"
// 第 93 行:"for (int i = 1; i < 8; i += 1)" → "for (float i = 1.0; i < 8.0; i += 1.0)"
// 第 99 行:"number angle = 2 * M_PI * stackoverflow_hash(hash, 5);" → "number angle = 2.0 * M_PI * stackoverflow_hash(hash, 5.0);"
// 第 100 行:"number dist = 0.1 + 0.3 * stackoverflow_hash(hash, 6);" → "number dist = 0.1 + 0.3 * stackoverflow_hash(hash, 6.0);"
// 第 104 行:"number size = sin(iter * M_PI) * (sqrt(i) / 3) * (0.05 + 0.2 * stackoverflow_hash(hash, 7));" → "number size = sin(iter * M_PI) * (sqrt(i) / 3.0) * (0.05 + 0.2 * stackoverflow_hash(hash, 7.0));"
// 第 106 行:"float star_angle = atan(adjusted_uv.x, adjusted_uv.y) + sin(shiny.r*10 + time + M_PI * stackoverflow_hash(hash, 8));" → "float star_angle = atan(adjusted_uv.x, adjusted_uv.y) + sin(shiny.r*10.0 + time + M_PI * stackoverflow_hash(hash, 8.0));"
// 第 107 行:"float star = size * 0.05 / cos(asin(cos(4*star_angle))/3 + 0.942477796077);" → "float star = size * 0.05 / cos(asin(cos(4.0*star_angle))/3.0 + 0.942477796077);"
// 第 111 行:"hsl.a = opacity + prev_opacity * (1 - opacity);" → "hsl.a = opacity + prev_opacity * (1.0 - opacity);"
// 第 112 行:"hsl.b = (opacity / hsl.a) + (hsl.b * prev_opacity * (1 - opacity) / hsl.a);" → "hsl.b = (opacity / hsl.a) + (hsl.b * prev_opacity * (1.0 - opacity) / hsl.a);"
// 第 119 行:"float ratio = 1;" → "float ratio = 1.0;"
// 第 120 行:"tex = ratio*RGB(hsl) + (1-ratio)*RGB(bhsl);" → "tex = ratio*RGB(hsl) + (1.0-ratio)*RGB(bhsl);"
// 第 223 行:"return transform_projection * vertex_position + vec4(0,0,0,scale);" → "return transform_projection * vertex_position + vec4(0.0,0.0,0.0,scale);"
// =====================
#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH)
#define PRECISION highp
#else
#define PRECISION mediump
#endif
#define M_PI 3.1415926535897932384626433832795
// Look ionized.fs for explanation
extern PRECISION vec2 shiny;
extern PRECISION number dissolve;
extern PRECISION number time;
// (sprite_pos_x, sprite_pos_y, sprite_width, sprite_height) [not normalized]
extern PRECISION vec4 texture_details;
// (width, height) for atlas texture [not normalized]
extern PRECISION vec2 image_details;
extern bool shadow;
extern PRECISION vec4 burn_colour_1;
extern PRECISION vec4 burn_colour_2;
// [Util]
// Transform color from HSL to RGB
vec4 RGB(vec4 c);
// [Util]
// Transform color from RGB to HSL
vec4 HSL(vec4 c);
// [Required]
// Apply dissolve effect (when card is being "burnt", e.g. when consumable is used)
vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv);
float stackoverflow_hash(number value, number index)
{
return fract(sin(dot(vec2(index/value, value/index), vec2(12.9898,78.233))) * 43758.5453);
}
number logisticCurve(number x)
{
return 1.0 / (1.0 + exp(6.0-8.0*x)) - 0.005;
}
number hideFormula(number x)
{
return 1.0 - pow(sin(M_PI/2.0 * x),20.0);
}
// This is what actually changes the look of card
vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords )
{
// Take pixel color (rgba) from `texture` at `texture_coords`, equivalent of texture2D in GLSL
vec4 tex = Texel(texture, texture_coords);
// Position of a pixel within the sprite
vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba;
float adjust_value = 0.5;
//adjust_value += 0.1 * sin(shiny.g + time);
vec2 adjusted_uv = uv - vec2(adjust_value, adjust_value);
vec4 hsl = HSL(tex); // convert texture to HSL values
vec4 bhsl = HSL(tex); // make a base copy of HSL values
hsl.r = 0.14;
hsl.g = 1.;
hsl.b = 0.7;
hsl.a = 0.0;
number time_val = shiny.g + time + 7777.0;
vec2 newCenter = vec2(0.0,0.0);
for (float i = 4.0; i < 8.0; i += 1.0)
{
number i_val = sqrt(i);
number iter = fract(time_val / i_val);
number hash = floor(time_val / i_val);
number angle = 2.0 * M_PI * stackoverflow_hash(hash, 1.0);
number dist = 0.1 + 0.3 * stackoverflow_hash(hash, 2.0);
newCenter.x = dist * cos(angle);
newCenter.y = dist * sin(angle);
adjusted_uv += newCenter;
number size = sin(iter * M_PI) * (sqrt(i) / 3.0) * (0.05 + 0.2 * stackoverflow_hash(hash, 3.0));
float star_angle = atan(adjusted_uv.x, adjusted_uv.y) + sin(shiny.r + time + M_PI * stackoverflow_hash(hash, 4.0));
float star = size * 0.2 / cos(asin(cos(5.0*star_angle))/10.0 + 0.942477796077);
number star_color = 1.2 - 15. * abs(length(adjusted_uv) - star) - 0.0075 / length(adjusted_uv);
number opacity = hideFormula(iter) * logisticCurve(star_color);
number prev_opacity = hsl.a;
hsl.a = opacity + prev_opacity * (1.0 - opacity);
hsl.b = (0.3 * stackoverflow_hash(hash, 9.0) + 0.6) * (opacity / hsl.a) + (hsl.b * prev_opacity / hsl.a);
adjusted_uv -= newCenter;
}
for (float i = 1.0; i < 8.0; i += 1.0)
{
number i_val = sqrt(i);
number iter = fract(time_val / i_val);
number hash = floor(time_val / i_val);
number angle = 2.0 * M_PI * stackoverflow_hash(hash, 5.0);
number dist = 0.1 + 0.3 * stackoverflow_hash(hash, 6.0);
newCenter.x = dist * cos(angle);
newCenter.y = dist * sin(angle);
adjusted_uv += newCenter;
number size = sin(iter * M_PI) * (sqrt(i) / 3.0) * (0.05 + 0.2 * stackoverflow_hash(hash, 7.0));
float star_angle = atan(adjusted_uv.x, adjusted_uv.y) + sin(shiny.r*10.0 + time + M_PI * stackoverflow_hash(hash, 8.0));
float star = size * 0.05 / cos(asin(cos(4.0*star_angle))/3.0 + 0.942477796077);
number star_color = star / length(adjusted_uv);
number opacity = min(1., max(0., hideFormula(iter) * logisticCurve(star_color)));
number prev_opacity = hsl.a;
hsl.a = opacity + prev_opacity * (1.0 - opacity);
hsl.b = (opacity / hsl.a) + (hsl.b * prev_opacity * (1.0 - opacity) / hsl.a);
adjusted_uv -= newCenter;
}
// Mix with base texture
float ratio = 1.0;
tex = ratio*RGB(hsl) + (1.0-ratio)*RGB(bhsl);
// required
return dissolve_mask(tex*colour, texture_coords, uv);
}
number hue(number s, number t, number h)
{
number hs = mod(h, 1.)*6.;
if (hs < 1.) return (t-s) * hs + s;
if (hs < 3.) return t;
if (hs < 4.) return (t-s) * (4.-hs) + s;
return s;
}
vec4 RGB(vec4 c)
{
if (c.y < 0.0001)
return vec4(vec3(c.z), c.a);
number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z);
number s = 2.0 * c.z - t;
return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w);
}
vec4 HSL(vec4 c)
{
number low = min(c.r, min(c.g, c.b));
number high = max(c.r, max(c.g, c.b));
number delta = high - low;
number sum = high+low;
vec4 hsl = vec4(.0, .0, .5 * sum, c.a);
if (delta == .0)
return hsl;
hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum);
if (high == c.r)
hsl.x = (c.g - c.b) / delta;
else if (high == c.g)
hsl.x = (c.b - c.r) / delta + 2.0;
else
hsl.x = (c.r - c.g) / delta + 4.0;
hsl.x = mod(hsl.x / 6., 1.);
return hsl;
}
vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv)
{
if (dissolve < 0.001) {
return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a);
}
float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values
float t = time * 10.0 + 2003.;
vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a);
vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a);
vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324));
vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532));
vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000));
float field = (1.+ (
cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) +
cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.;
vec2 borders = vec2(0.2, 0.8);
float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14))
- (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve);
if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) {
if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) {
tex.rgba = burn_colour_1.rgba;
} else if (burn_colour_2.a > 0.01) {
tex.rgba = burn_colour_2.rgba;
}
}
return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0);
}
// for transforming the card while your mouse is on it
extern PRECISION vec2 mouse_screen_pos;
extern PRECISION float hovering;
extern PRECISION float screen_scale;
#ifdef VERTEX
vec4 position( mat4 transform_projection, vec4 vertex_position )
{
if (hovering <= 0.){
return transform_projection * vertex_position;
}
float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy);
vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale;
float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist);
return transform_projection * vertex_position + vec4(0.0,0.0,0.0,scale);
}
#endif
================================================
FILE: assets/shaders/zorua.fs
================================================
// === GLSL Fix Log ===
// 修复时间: Mon Jul 21 14:15:41 CST 2025
// 文件来源: zorua.fs
// 共修改 1 行
// 第 140 行:"return transform_projection * vertex_position + vec4(0,0,0,scale);" → "return transform_projection * vertex_position + vec4(0.0,0.0,0.0,scale);"
// =====================
#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH)
#define MY_HIGHP_OR_MEDIUMP highp
#else
#define MY_HIGHP_OR_MEDIUMP mediump
#endif
extern MY_HIGHP_OR_MEDIUMP vec2 zorua;
extern MY_HIGHP_OR_MEDIUMP number dissolve;
extern MY_HIGHP_OR_MEDIUMP number time;
extern MY_HIGHP_OR_MEDIUMP vec4 texture_details;
extern MY_HIGHP_OR_MEDIUMP vec2 image_details;
extern bool shadow;
extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1;
extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2;
vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv)
{
if (dissolve < 0.001) {
return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a);
}
float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values
float t = time * 10.0 + 2003.;
vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a);
vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a);
vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324));
vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532));
vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000));
float field = (1.+ (
cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) +
cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.;
vec2 borders = vec2(0.2, 0.8);
float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14))
- (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve);
if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) {
if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) {
tex.rgba = burn_colour_1.rgba;
} else if (burn_colour_2.a > 0.01) {
tex.rgba = burn_colour_2.rgba;
}
}
return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0);
}
number hue(number s, number t, number h)
{
number hs = mod(h, 1.)*6.;
if (hs < 1.) return (t-s) * hs + s;
if (hs < 3.) return t;
if (hs < 4.) return (t-s) * (4.-hs) + s;
return s;
}
vec4 RGB(vec4 c)
{
if (c.y == 0.)
return vec4(vec3(c.z), c.a);
number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z);
number s = 2.0 * c.z - t;
return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w);
}
vec4 HSL(vec4 c)
{
number low = min(c.r, min(c.g, c.b));
number high = max(c.r, max(c.g, c.b));
number delta = high - low;
number sum = high+low;
vec4 hsl = vec4(.0, .0, .5 * sum, c.a);
if (delta == .0)
return hsl;
hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum);
if (high == c.r)
hsl.x = (c.g - c.b) / delta;
else if (high == c.g)
hsl.x = (c.b - c.r) / delta + 2.0;
else
hsl.x = (c.r - c.g) / delta + 4.0;
hsl.x = mod(hsl.x / 6., 1.);
return hsl;
}
vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords )
{
vec4 tex = Texel(texture, texture_coords);
vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba;
vec2 adjusted_uv = uv - vec2(0.5, 0.5);
tex = vec4(0., 0., 0., tex.a);
float t = zorua.y*22.221 + time;
vec2 floored_uv = (floor((uv*texture_details.ba)))/texture_details.ba;
vec2 uv_scaled_centered = (floored_uv - 0.5);
vec2 field_part1 = 200.*(uv_scaled_centered + vec2(sin(-t / 143.6340), cos(-t / 99.4324)));
vec2 field_part2 = 200.*(uv_scaled_centered + vec2(cos( t / 53.1532), cos( t / 61.4532)));
vec2 field_part3 = 200.*(uv_scaled_centered + vec2(sin(-t / 87.53218), sin(-t / 49.0000)));
float field = (1.+ (
cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) +
cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.;
float res = (.5 + .5* cos( (zorua.x) * 2.612 + ( field + -.5 ) *3.14));
tex = vec4(0., 0., 0., min(tex.a, res * min(0.3, 0.075/length(adjusted_uv))));
return dissolve_mask(tex*colour, texture_coords, uv);
}
extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos;
extern MY_HIGHP_OR_MEDIUMP float hovering;
extern MY_HIGHP_OR_MEDIUMP float screen_scale;
#ifdef VERTEX
vec4 position( mat4 transform_projection, vec4 vertex_position )
{
if (hovering <= 0.){
return transform_projection * vertex_position;
}
float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy);
vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale;
float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist);
return transform_projection * vertex_position + vec4(0.0,0.0,0.0,scale);
}
#endif
================================================
FILE: backs/backs1.lua
================================================
init = function()
local backapply_orig = Back.apply_to_run
function Back.apply_to_run(self)
backapply_orig(self)
G.E_MANAGER:add_event(Event({
func = function()
if G.GAME.modifiers.poke_force_seal then
for i = 1, #G.playing_cards do
G.playing_cards[i]:set_seal(G.GAME.modifiers.poke_force_seal, true)
end
end
return true
end,
}))
end
end
local pokemondeck = {
name = "pokemondeck",
key = "pokemondeck",
unlocked = true,
discovered = true,
config = {vouchers = { "v_poke_goodrod"}},
loc_vars = function(self, info_queue, center)
return {vars = {localize("goodrod_variable"), localize("pokeball_variable")}}
end,
pos = { x = 0, y = 0 },
atlas = "AtlasDecksBasic",
apply = function(self)
G.E_MANAGER:add_event(Event({
func = function()
if (SMODS.Mods["CardSleeves"] or {}).can_load and G.GAME.selected_sleeve == 'sleeve_poke_pokemonsleeve' then
SMODS.add_card { key = 'c_poke_greatball' }
else
SMODS.add_card { key = 'c_poke_pokeball' }
end
return true
end
}))
end
}
local luminousdeck = {
name = "luminousdeck",
key = "luminousdeck",
unlocked = true,
discovered = true,
config = {},
loc_vars = function(self, info_queue, center)
return {vars = {}}
end,
pos = { x = 1, y = 0 },
atlas = "AtlasDecksBasic",
apply = function(self)
G.GAME.modifiers.apply_type = true
end
}
local obituarydeck = {
name = "obituarydeck",
key = "obituarydeck",
unlocked = true,
discovered = true,
legacy_deck = true,
config = {},
loc_vars = function(self, info_queue, center)
return {vars = {localize("pinkseal_variable")}}
end,
pos = { x = 2, y = 0 },
atlas = "AtlasDecksBasic",
apply = function(self)
G.GAME.modifiers.poke_force_seal = "poke_pink_seal"
end,
}
local revenantdeck = {
name = "revenanteck",
key = "revenantdeck",
unlocked = true,
discovered = true,
legacy_deck = true,
artist = "Sonfive",
config = {},
loc_vars = function(self, info_queue, center)
return {vars = {localize("silverseal_variable")}}
end,
pos = { x = 5, y = 0 },
atlas = "AtlasDecksBasic",
apply = function(self)
G.GAME.modifiers.poke_force_seal = "poke_silver"
end,
}
local telekineticdeck = {
name = "telekineticdeck",
key = "telekineticdeck",
unlocked = true,
discovered = true,
artist = "MyDude_YT",
config = {vouchers = { "v_crystal_ball"}, consumables = {'c_poke_twisted_spoon', 'c_poke_twisted_spoon'}},
loc_vars = function(self, info_queue, center)
return {vars = {localize{type = 'name_text', key = 'v_crystal_ball', set = 'Voucher'}, localize("twisted_spoon_variable")}}
end,
pos = { x = 3, y = 0 },
atlas = "AtlasDecksBasic",
}
local ampeddeck = {
name = "ampeddeck",
key = "ampeddeck",
unlocked = true,
discovered = true,
artist = "MyDude_YT",
config = {vouchers = { "v_poke_energysearch"}, consumables = {'c_poke_double_rainbow_energy'}},
loc_vars = function(self, info_queue, center)
return {vars = {localize{type = 'name_text', key = 'v_poke_energysearch', set = 'Voucher'}, localize("double_rainbow_energy_variable")}}
end,
pos = { x = 4, y = 0 },
atlas = "AtlasDecksBasic",
}
local futuredeck = {
name = "futuredeck",
key = "futuredeck",
unlocked = true,
discovered = true,
artist = "Catzzadilla",
config = {scry = 4},
loc_vars = function(self, info_queue, center)
return {vars = {self.config.scry}}
end,
pos = { x = 6, y = 0 },
atlas = "AtlasDecksBasic",
apply = function(self)
G.GAME.scry_amount = (G.GAME.scry_amount or 0) + self.config.scry
end
}
local stadiumdeck = {
name = "stadiumdeck",
key = "stadiumdeck",
unlocked = true,
discovered = true,
artist = "InertSteak",
config = {},
loc_vars = function(self, info_queue, center)
return {vars = {}}
end,
pos = { x = 8, y = 0 },
atlas = "AtlasDecksBasic",
apply = function(self)
G.E_MANAGER:add_event(Event({
func = function()
local enhancements = {"m_bonus", "m_mult", "m_wild", "m_glass", "m_steel", "m_stone", "m_gold", "m_lucky"}
for i = 1, math.min(#G.deck.cards, #enhancements) do
G.deck.cards[i]:set_ability(G.P_CENTERS[enhancements[i]], nil, true)
end
return true
end
}))
end
}
local megadeck = {
name = "megadeck",
key = "megadeck",
unlocked = true,
discovered = true,
artist = {"Catzzadilla", "Sonfive"},
config = {vouchers = { "v_reroll_surplus", "v_reroll_glut", "v_crystal_ball"}, consumables = {'c_poke_megastone'}, shop_size = 1},
loc_vars = function(self, info_queue, center)
return {vars = {localize("megastone_variable"), localize{type = 'name_text', key = 'v_reroll_surplus', set = 'Voucher'}, localize{type = 'name_text', key = 'v_reroll_glut', set = 'Voucher'},
self.config.shop_size, localize{type = 'name_text', key = 'v_crystal_ball', set = 'Voucher'}}}
end,
pos = { x = 9, y = 0 },
atlas = "AtlasDecksBasic",
apply = function(self)
G.E_MANAGER:add_event(Event({
func = function()
change_shop_size(-self.config.shop_size)
return true
end
}))
end,
}
--Vending Sleeve
local vendingdeck = {
name = "vendingdeck",
key = "vendingdeck",
unlocked = true,
discovered = true,
config = {},
loc_vars = function(self, info_queue, center)
return { vars = { localize { type = 'name_text', key = 'tag_voucher', set = 'Tag' } } }
end,
pos = { x = 7, y = 0 },
atlas = "AtlasDecksBasic",
calculate = function(self, back, context)
if not ((SMODS.Mods["CardSleeves"] or {}).can_load and G.GAME.selected_sleeve == 'sleeve_poke_vendingsleeve') then
if context.round_eval and G.GAME.last_blind and G.GAME.last_blind.boss and ((G.GAME.round_resets.ante - 1) % 2 == 1) then
G.E_MANAGER:add_event(Event({
func = function()
add_tag(Tag('tag_voucher'))
play_sound('generic1', 0.9 + math.random() * 0.1, 0.8)
play_sound('holo1', 1.2 + math.random() * 0.1, 0.4)
return true
end
}))
end
end
end,
}
local diceydeck = {
name = "diceydeck",
key = "diceydeck",
unlocked = true,
discovered = true,
config = {no_interest = true, hazard_layer = 1, hazard_layer_max = 1, h_size = 1, money = 1},
loc_vars = function(self, info_queue, center)
return {vars = {self.config.hazard_layer, self.config.hazard_layer_max, self.config.h_size, self.config.money}}
end,
pos = { x = 10, y = 0 },
atlas = "AtlasDecksBasic",
artist = 'Catzzadilla',
apply = function(self)
G.E_MANAGER:add_event(Event({
func = function()
poke_change_hazard_max(self.config.hazard_layer_max)
poke_change_hazard_level(self.config.hazard_layer)
G.hand:change_size(self.config.h_size)
G.GAME.modifiers.enhance_bonus = 'm_poke_hazard'
G.GAME.modifiers.money_per_enhancement = self.config.money
G.GAME.modifiers.enhance_bonus_text = localize('poke_hazards_in_deck')
G.GAME.modifiers.enhance_bonus_color = G.ARGS.LOC_COLOURS["hazard"]
return true
end
}))
end,
}
local dList = {luminousdeck, telekineticdeck, ampeddeck, futuredeck, stadiumdeck, megadeck, vendingdeck, diceydeck}
if pokermon_config.pokeballs then
table.insert(dList, 1, pokemondeck)
end
if pokermon_config.pokemon_legacy then
table.insert(dList, obituarydeck)
table.insert(dList, revenantdeck)
end
return {name = "Back",
init = init,
list = dList
}
================================================
FILE: blinds/pokebossblind.lua
================================================
local mirror = {
key = "mirror",
dollars = 5,
mult = 2,
boss = { min = 3, max = 80 },
pos = { x = 0, y = 1 },
atlas = "AtlasBossblinds",
artist = "InertSteak",
boss_colour = HEX("C57BE6"),
debuff = {},
config = {trans_key = "j_joker", reset_eternal = false},
discovered = true,
calculate = function(self, blind, context)
if context.setting_blind and not blind.disabled then
if #G.jokers.cards > 0 then
local target = G.jokers.cards[#G.jokers.cards]
if not target.getting_sliced then
if target.ability.eternal then
blind.effect.reset_eternal = true
target:set_eternal(false)
end
target.ability.from_mirror = true
blind.effect.trans_key = target.config.center_key
poke_evolve(target, 'j_poke_ditto', nil, localize("poke_transform_success"), true)
end
end
end
if context.blind_disabled then
local target = nil
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].ability.from_mirror then
target = G.jokers.cards[i]
end
end
if target then
poke_evolve(target, blind.effect.trans_key, nil, localize("poke_transform_success"), true)
if blind.effect.reset_eternal then
target.ability.eternal = true
end
end
end
if context.end_of_round and not context.repetition and not context.individual then
for i = 1, #G.jokers.cards do
G.jokers.cards[i].ability.from_mirror = nil
end
end
end,
}
local rocket = {
key = "rocket",
dollars = 5,
mult = 2,
boss = { min = 2, max = 80 },
pos = { x = 0, y = 2 },
atlas = "AtlasBossblinds",
artist = "Catzzadilla",
boss_colour = HEX("C90000"),
debuff = {},
config = {},
discovered = true,
calculate = function(self, blind, context)
if not blind.disabled then
if context.stay_flipped and context.to_area == G.hand then
local dollars = G.GAME.dollars
if (SMODS.Mods["Talisman"] or {}).can_load then
dollars = to_number(dollars)
end
if dollars >= 25 then
return {
stay_flipped = true
}
end
end
end
end,
}
local magma = {
key = "magma",
dollars = 5,
mult = 2,
boss = { min = 2, max = 80 },
pos = { x = 0, y = 5 },
atlas = "AtlasBossblinds",
artist = "Catzzadilla",
boss_colour = HEX("EB2D31"),
debuff = {},
config = {},
discovered = true,
calculate = function(self, blind, context)
if not blind.disabled then
if context.modify_hand then
blind.triggered = true
hand_chips = mod_chips(math.max(math.floor(hand_chips * 0.25 + 0.75), 0))
update_hand_text({ sound = 'chips2', modded = true }, { chips = hand_chips, mult = mult })
end
end
end
}
local aqua = {
key = "aqua",
dollars = 5,
mult = 2,
boss = { min = 2, max = 80 },
pos = { x = 0, y = 7 },
atlas = "AtlasBossblinds",
artist = "Catzzadilla",
boss_colour = HEX("38B8F8"),
debuff = {},
config = {},
discovered = true,
calculate = function(self, blind, context)
if not blind.disabled then
if context.modify_hand then
blind.triggered = true
mult = mod_mult(math.max(math.floor(mult * 0.25 + 0.75), 1))
update_hand_text({ sound = 'chips2', modded = true }, { chips = hand_chips, mult = mult })
end
end
end
}
local pick_random_types = function(amount)
local ptype_list = copy_table(POKE_TYPES)
pseudoshuffle(ptype_list, 'chart')
local ptypes = {}
for i = 1, amount do
ptypes[#ptypes+1] = ptype_list[i]
end
return ptypes
end
local star={
key = "star",
dollars = 5,
mult = 2,
boss = { showdown = false, min = 3, max = 80 },
boss_colour = HEX("D9B673"),
pos = { x = 0, y = 24 },
atlas = "AtlasBossblinds",
artist = "Catzzadilla",
discovered = true,
config = {ptype = nil},
calculate = function(self, blind, context)
if not blind.disabled then
if context.debuff_card and context.debuff_card.area == G.jokers
and blind.effect.ptype and is_type(context.debuff_card, blind.effect.ptype) then
return {
debuff = true
}
end
if context.press_play or context.setting_blind then
blind.effect.ptype = pick_random_types(1)[1]
blind.triggered = true
blind.prepped = true
end
if context.drawing_cards and blind.prepped then
for _, v in ipairs(G.jokers.cards) do
if v.debuff then
SMODS.recalc_debuff(v)
elseif blind.effect.ptype and is_type(v, blind.effect.ptype) then
SMODS.recalc_debuff(v)
v:juice_up()
end
end
blind:wiggle()
end
end
if context.drawing_cards then
blind.prepped = nil
end
end,
}
gray_godfather_remove = function(difference)
local in_debt = nil
local dollars = nil
local buffer = nil
if (SMODS.Mods["Talisman"] or {}).can_load then
dollars = to_number(G.GAME.dollars or 0)
buffer = to_number(G.GAME.dollar_buffer or 0)
else
dollars = (G.GAME.dollars or 0)
buffer = (G.GAME.dollar_buffer or 0)
end
in_debt = dollars + buffer - difference < 0
if in_debt then
local destructable_jokers = {}
for i = 1, #G.jokers.cards do
if not SMODS.is_eternal(G.jokers.cards[i]) and not G.jokers.cards[i].getting_sliced then
destructable_jokers[#destructable_jokers + 1] = G.jokers.cards[i]
end
end
local joker_to_destroy = pseudorandom_element(destructable_jokers, 'gray_godfather')
if joker_to_destroy then
joker_to_destroy.getting_sliced = true
G.E_MANAGER:add_event(Event({
func = function()
joker_to_destroy:start_dissolve({ G.C.RED }, nil, 1.6)
return true
end
}))
end
end
end
local gray_godfather = {
key = "gray_godfather",
dollars = 8,
mult = 2,
boss = { showdown = true, min = 8, max = 80 },
pos = { x = 0, y = 3 },
atlas = "AtlasBossblinds",
boss_colour = HEX("B3B3B3"),
debuff = {},
config = {dollars = 5},
discovered = true,
loc_vars = function(self)
return {vars = {self.config.dollars}}
end,
collection_loc_vars = function(self)
return {vars = {self.config.dollars}}
end,
calculate = function(self, blind, context)
if not blind.disabled then
if context.before then
ease_dollars(-self.config.dollars)
gray_godfather_remove(self.config.dollars)
end
if context.pre_discard then
ease_dollars(-self.config.dollars)
gray_godfather_remove(self.config.dollars)
end
end
end,
}
white_executive_total = function()
local total = 0
for _, area in ipairs({ G.jokers, G.consumeables }) do
for _, other_card in ipairs(area.cards) do
total = total + other_card.sell_cost
end
end
total = math.floor(total)
return total
end
local white_executive = {
key = "white_executive",
dollars = 8,
mult = 2,
boss = { showdown = true, min = 8, max = 80 },
pos = { x = 0, y = 4 },
atlas = "AtlasBossblinds",
boss_colour = HEX("E8E8F8"),
debuff = {},
config = {},
discovered = true,
loc_vars = function(self)
return {vars = {white_executive_total()}}
end,
collection_loc_vars = function(self)
return {vars = {white_executive_total()}}
end,
calculate = function(self, blind, context)
if not blind.disabled then
if context.setting_blind then
local modify = function(v) SMODS.debuff_card(v, true, 'white_executive'); end
local args = {array = G.playing_cards, amt = white_executive_total(), seed = 'whiteexec', mod_func = modify}
pseudorandom_multi(args)
end
if context.end_of_round and not context.individual and not context.repetition then
for k, v in pairs(G.playing_cards) do
SMODS.debuff_card(v,false, 'white_executive')
end
end
end
end,
disable = function(self)
for k, v in pairs(G.playing_cards) do
SMODS.debuff_card(v,false,'white_executive')
end
end
}
local ptype_matches = function(card, types)
for _, v in ipairs(types) do
if is_type(card, v) then return true end
end
return false
end
local iridescent_hacker={
key = "iridescent_hacker",
dollars = 8,
mult = 2,
boss = { showdown = true, min = 8, max = 80 },
boss_colour = HEX("505860"),
pos = { x = 0, y = 25 },
atlas = "AtlasBossblinds",
artist = "Catzzadilla",
discovered = true,
debuff = {},
config = {ptypes = {}},
calculate = function(self, blind, context)
if not blind.disabled then
if context.debuff_card and context.debuff_card.area == G.jokers
and ptype_matches(context.debuff_card, blind.effect.ptypes) then
return {
debuff = true
}
end
if context.press_play or context.setting_blind then
local type_count = 1
local chance_to_increase = pseudorandom('increasetypes')
if chance_to_increase > .66 then type_count = type_count + 1 end
if chance_to_increase > .33 then type_count = type_count + 1 end
blind.effect.ptypes = pick_random_types(type_count)
blind.triggered = true
blind.prepped = true
end
if context.drawing_cards and blind.prepped then
for _, v in ipairs(G.jokers.cards) do
if v.debuff then
SMODS.recalc_debuff(v)
elseif ptype_matches(v, blind.effect.ptypes) then
SMODS.recalc_debuff(v)
v:juice_up()
end
end
blind:wiggle()
end
end
if context.drawing_cards then
blind.prepped = nil
end
end,
}
return {name = "Blinds",
list = {mirror, rocket, star, gray_godfather, white_executive, iridescent_hacker}
}
================================================
FILE: boosters/packs1.lua
================================================
local create_energy = function(self, card)
if pseudoseed('rainbow') < .10 then
return create_card("Spectral", G.pack_cards, nil, nil, true, true, 'c_poke_double_rainbow_energy', nil)
end
local match_type = pseudorandom(pseudoseed('match'))
if match_type > .50 and #G.jokers.cards > 0 then
local energy_types = {}
for l, v in pairs(G.jokers.cards) do
local match = matching_energy(v)
if match and not next(SMODS.find_card(match)) then
table.insert(energy_types, match)
end
end
if #energy_types > 0 then
local energy = pseudorandom_element(energy_types, pseudoseed('match'))
return create_card("Energy", G.pack_cards, nil, nil, true, true, energy, nil)
end
end
return create_card("Energy", G.pack_cards, nil, nil, true, true, nil, nil)
end
local poll_evo_item = function(seed)
local evo_item_key_set = {}
for _, v in pairs(G.jokers.cards) do
if v.config.center.item_req then
local item_req = type(v.config.center.item_req) == 'table'
and pseudorandom_element(v.config.center.item_req, pseudoseed(seed))
or v.config.center.item_req
local prefix = table.contains(native_evo_items, item_req)
and 'poke'
or v.config.center.poke_custom_prefix
local item_key = 'c_' .. prefix .. '_' .. item_req
evo_item_key_set[item_key] = true
end
end
local evo_item_key_list = {}
for key, _ in pairs(evo_item_key_set) do
if G.P_CENTERS[key] and not G.GAME.used_jokers[key] and not G.GAME.banned_keys[key] and (not (type(G.P_CENTERS[key].in_pool) == 'function') or G.P_CENTERS[key]:in_pool()) then
evo_item_key_list[#evo_item_key_list+1] = key
end
end
if #evo_item_key_list > 1 then
return pseudorandom_element(evo_item_key_list, pseudoseed(seed))
end
return evo_item_key_list[1]
end
local create_item = function(seed)
if pseudorandom(pseudoseed(seed .. '_evo_item')) > .92 then
local evo_item_key = poll_evo_item('match')
if evo_item_key then
return SMODS.create_card { key = evo_item_key, area = G.pack_cards, skip_materialize = true }
end
end
return SMODS.create_card { set = "Item", area = G.pack_cards, skip_materialize = true, soulable = true, key_append = seed }
end
local create_pocket_card = function(self, card, i)
if i == 1 then
if not G.GAME.modifiers.no_energy then
return create_energy(self, card)
else
return create_item('pocket')
end
elseif i == 2 and card.from_tag and G.GAME.round_resets.ante >= 5 and not next(SMODS.find_card('c_poke_megastone')) then
local mega = pseudorandom(pseudoseed('pocket'))
if mega > .75 then
return create_card("Item", G.pack_cards, nil, nil, true, true, 'c_poke_megastone', nil)
else
return create_item('pocket')
end
else
return create_item('pocket')
end
end
local pocket_background = function(self)
ease_background_colour{new_colour = G.ARGS.LOC_COLOURS.pocket, contrast = 3}
end
local pocket_particle = function(self)
G.booster_pack_sparkles = Particles(1, 1, 0,0, {
timer = 0.015,
scale = 0.1,
initialize = true,
lifespan = 3,
speed = 0.2,
padding = -1,
attach = G.ROOM_ATTACH,
colours = {G.C.WHITE, lighten(G.C.RED, 0.2)},
fill = true
})
G.booster_pack_sparkles.fade_alpha = 1
G.booster_pack_sparkles:fade(1, 0)
end
local pack1 = {
name = "Pocket Pack",
key = "pokepack_normal_1",
kind = "Energy",
atlas = "AtlasBoosterpacksBasic",
pos = { x = 0, y = 0 },
config = { extra = 4, choose = 1 },
cost = 4,
order = 1,
weight = 1,
draw_hand = true,
unlocked = true,
discovered = true,
create_card = create_pocket_card,
loc_vars = function(self, info_queue, card)
return { vars = { card.config.center.config.choose, card.ability.extra - 1, 1 } }
end,
group_key = "k_poke_pocket_pack",
}
local pack2 = {
name = "Pocket Pack",
key = "pokepack_normal_2",
kind = "Energy",
atlas = "AtlasBoosterpacksBasic",
pos = { x = 1, y = 0 },
config = { extra = 4, choose = 1 },
cost = 4,
order = 2,
weight = 1,
draw_hand = true,
unlocked = true,
discovered = true,
create_card = create_pocket_card,
loc_vars = function(self, info_queue, card)
return { vars = { card.config.center.config.choose, card.ability.extra - 1, 1 } }
end,
group_key = "k_poke_pocket_pack",
}
local pack3 = {
name = "Jumbo Pocket Pack",
key = "pokepack_jumbo_1",
kind = "Energy",
atlas = "AtlasBoosterpacksBasic",
pos = { x = 2, y = 0 },
config = { extra = 6, choose = 1 },
cost = 6,
order = 3,
weight = 1,
draw_hand = true,
unlocked = true,
discovered = true,
create_card = create_pocket_card,
loc_vars = function(self, info_queue, card)
return { vars = { card.config.center.config.choose, card.ability.extra - 1, 1 } }
end,
group_key = "k_poke_pocket_pack",
}
local pack4 = {
name = "Mega Pocket Pack",
key = "pokepack_mega_1",
kind = "Energy",
atlas = "AtlasBoosterpacksBasic",
pos = { x = 3, y = 0 },
config = { extra = 6, choose = 2 },
cost = 8,
order = 4,
weight = 0.25,
draw_hand = true,
unlocked = true,
discovered = true,
create_card = create_pocket_card,
loc_vars = function(self, info_queue, card)
return { vars = { card.config.center.config.choose, card.ability.extra - 1, 1 } }
end,
group_key = "k_poke_pocket_pack",
}
local pack5 = {
name = "Pocket Pack",
key = "pokepack_normal_3",
kind = "Energy",
atlas = "AtlasBoosterpacksBasic",
pos = { x = 0, y = 1 },
config = { extra = 4, choose = 1 },
cost = 4,
order = 1,
weight = 1,
draw_hand = true,
unlocked = true,
discovered = true,
create_card = create_pocket_card,
loc_vars = function(self, info_queue, card)
return { vars = { card.config.center.config.choose, card.ability.extra - 1, 1 } }
end,
group_key = "k_poke_pocket_pack",
}
local pack6 = {
name = "Pocket Pack",
key = "pokepack_normal_4",
kind = "Energy",
atlas = "AtlasBoosterpacksBasic",
pos = { x = 1, y = 1 },
config = { extra = 4, choose = 1 },
cost = 4,
order = 2,
weight = 1,
draw_hand = true,
unlocked = true,
discovered = true,
create_card = create_pocket_card,
loc_vars = function(self, info_queue, card)
return { vars = { card.config.center.config.choose, card.ability.extra - 1, 1 } }
end,
group_key = "k_poke_pocket_pack",
}
local pack7 = {
name = "Jumbo Pocket Pack",
key = "pokepack_jumbo_2",
kind = "Energy",
atlas = "AtlasBoosterpacksBasic",
pos = { x = 2, y = 1 },
config = { extra = 6, choose = 1 },
cost = 6,
order = 3,
weight = 1,
draw_hand = true,
unlocked = true,
discovered = true,
create_card = create_pocket_card,
loc_vars = function(self, info_queue, card)
return { vars = { card.config.center.config.choose, card.ability.extra - 1, 1 } }
end,
group_key = "k_poke_pocket_pack",
}
local pack8 = {
name = "Mega Pocket Pack",
key = "pokepack_mega_2",
kind = "Energy",
atlas = "AtlasBoosterpacksBasic",
pos = { x = 3, y = 1 },
config = { extra = 6, choose = 2 },
cost = 8,
order = 4,
weight = 0.25,
draw_hand = true,
unlocked = true,
discovered = true,
create_card = create_pocket_card,
loc_vars = function(self, info_queue, card)
return { vars = { card.config.center.config.choose, card.ability.extra - 1, 1 } }
end,
group_key = "k_poke_pocket_pack",
}
local wish_pack = {
name = "Wish Pack",
key = "pokepack_wish_pack",
kind = "Spectral",
atlas = "AtlasBoosterpacksBasic",
artist = "Catzzadilla",
pos = { x = 4, y = 0 },
config = { extra = 6, choose = 1 },
cost = 999,
order = 4,
weight = 0,
draw_hand = false,
unlocked = true,
discovered = true,
no_collection = true,
create_card = function(self, card, i)
-- force pack_choices to 1
G.GAME.pack_choices = 1
local jirachi_cards = {'c_poke_fake_banker', 'c_poke_fake_booster', 'c_poke_fake_power', 'c_poke_fake_copy', 'c_poke_fake_fixer', 'c_poke_fake_masterball', }
local temp_card = {area = G.pack_cards, key = jirachi_cards[1 + (i-1)%6], no_edition = true, skip_materialize = true}
if not G.P_CENTERS[temp_card.key] then temp_card.key = 'c_judgement' end
return SMODS.create_card(temp_card)
end,
loc_vars = function(self, info_queue, card)
return { vars = { card.config.center.config.choose, card.ability.extra - 1, 1 } }
end,
in_pool = function(self)
return false
end,
ease_background_colour = function(self)
--Copy planet packs
ease_colour(G.C.DYN_UI.MAIN, mix_colours(G.C.SECONDARY_SET.Planet, G.C.BLACK, 0.9))
ease_background_colour{new_colour = G.C.BLACK, contrast = 3}
end,
particles = function(self)
G.booster_pack_stars = Particles(1, 1, 0,0, {
timer = 0.07,
scale = 0.1,
initialize = true,
lifespan = 15,
speed = 0.1,
padding = -4,
attach = G.ROOM_ATTACH,
colours = {G.C.WHITE, HEX('a7d6e0'), HEX('fddca0')},
fill = true
})
G.booster_pack_meteors = Particles(1, 1, 0,0, {
timer = 2,
scale = 0.05,
lifespan = 1.5,
speed = 4,
attach = G.ROOM_ATTACH,
colours = {G.C.WHITE},
fill = true
})
end,
group_key = "k_poke_wish_pack",
}
local starter_pack = {
name = "Starter Pack",
key = "pokepack_starter_pack",
kind = "Spectral",
artist = {name = {"Currently a placeholder!", "Want your art here?", "Join the Discord!"}},
atlas = "AtlasBoosterpacksBasic",
pos = { x = 4, y = 1 },
config = { extra = 4, choose = 1 },
cost = 6,
order = 5,
weight = 0,
draw_hand = false,
unlocked = true,
discovered = true,
create_card = function(self, card, i)
local grass_starters = {}
local fire_starters = {}
local water_starters = {}
local pseudo_starters = {}
local pika_eevee = {}
local pack_key = nil
for k, v in ipairs(G.P_CENTER_POOLS["Joker"]) do
if not poke_family_present(v) then
if v.starter and v.ptype == "Grass" then
grass_starters[#grass_starters + 1] = v.key
end
if v.starter and v.ptype == "Fire" then
fire_starters[#fire_starters + 1] = v.key
end
if v.starter and v.ptype == "Water" then
water_starters[#water_starters + 1] = v.key
end
if v.pseudol then
pseudo_starters[#pseudo_starters + 1] = v.key
end
if v.name == "pikachu" or v.name == "eevee" then
pika_eevee[#pika_eevee + 1] = v.key
end
end
end
if i == 1 and #grass_starters > 0 then
pack_key = pseudorandom_element(grass_starters, pseudoseed('grass'))
elseif i == 2 and #fire_starters > 0 then
pack_key = pseudorandom_element(fire_starters, pseudoseed('fire'))
elseif i == 3 and #water_starters > 0 then
pack_key = pseudorandom_element(water_starters, pseudoseed('water'))
elseif i == 4 and #pika_eevee > 0 then
pack_key = pseudorandom_element(pika_eevee, pseudoseed('pikaeevee'))
elseif i == 5 and #pseudo_starters > 0 then
pack_key = pseudorandom_element(pseudo_starters, pseudoseed('pseudo'))
else
if G.P_CENTERS['j_poke_caterpie'] then
pack_key = 'j_poke_caterpie'
else
pack_key = nil
end
end
local temp_card = {area = G.pack_cards, key = pack_key, no_edition = true, skip_materialize = true}
return SMODS.create_card(temp_card)
end,
loc_vars = function(self, info_queue, card)
return { vars = { card.config.center.config.choose, card.ability.extra} }
end,
in_pool = function(self)
return false
end,
ease_background_colour = function(self)
ease_background_colour{new_colour = HEX('FFFFFF'), contrast = 3}
end,
particles = function(self)
G.booster_pack_stars = Particles(1, 1, 0,0, {
timer = 0.07,
scale = 0.1,
initialize = true,
lifespan = 15,
speed = 0.1,
padding = -4,
attach = G.ROOM_ATTACH,
colours = {G.C.RED, G.C.BLUE, G.C.GREEN},
fill = true
})
end,
group_key = "k_poke_starter_pack",
}
local starterq_pack = {
name = "Starteq Pack",
key = "pokepack_starterq_pack",
kind = "Spectral",
artist = {name = {"Currently a placeholder!", "Want your art here?", "Join the Discord!"}},
atlas = "AtlasBoosterpacksBasic",
pos = { x = 4, y = 1 },
config = { extra = 4, choose = 1 },
cost = 6,
order = 5,
weight = 0,
no_collection = true,
draw_hand = false,
unlocked = true,
discovered = true,
create_card = function(self, card, i)
local grass_starters = {}
local fire_starters = {}
local water_starters = {}
local pseudo_starters = {}
local bidoof_yamper = {}
local pack_key = nil
for k, v in ipairs(G.P_CENTER_POOLS["Joker"]) do
if not poke_family_present(v) then
if v.knockoff_starter and v.ptype == "Grass" then
grass_starters[#grass_starters + 1] = v.key
end
if v.knockoff_starter and v.ptype == "Fire" then
fire_starters[#fire_starters + 1] = v.key
end
if v.knockoff_starter and v.ptype == "Water" then
water_starters[#water_starters + 1] = v.key
end
if v.knockoff_pseudol then
pseudo_starters[#pseudo_starters + 1] = v.key
end
if v.name == "bidoof" or v.name == "yamper" then
bidoof_yamper[#bidoof_yamper + 1] = v.key
end
end
end
if i == 1 and #grass_starters > 0 then
pack_key = pseudorandom_element(grass_starters, pseudoseed('grass'))
elseif i == 2 and #fire_starters > 0 then
pack_key = pseudorandom_element(fire_starters, pseudoseed('fire'))
elseif i == 3 and #water_starters > 0 then
pack_key = pseudorandom_element(water_starters, pseudoseed('water'))
elseif i == 4 and #bidoof_yamper > 0 then
pack_key = pseudorandom_element(bidoof_yamper, pseudoseed('pikaeevee'))
elseif i == 5 and #pseudo_starters > 0 then
pack_key = pseudorandom_element(pseudo_starters, pseudoseed('pseudo'))
else
if G.P_CENTERS['j_poke_caterpie'] then
pack_key = 'j_poke_caterpie'
else
pack_key = nil
end
end
local temp_card = {area = G.pack_cards, key = pack_key, no_edition = true, skip_materialize = true}
return SMODS.create_card(temp_card)
end,
loc_vars = function(self, info_queue, card)
return { vars = { card.config.center.config.choose, card.ability.extra} }
end,
in_pool = function(self)
return false
end,
ease_background_colour = function(self)
ease_background_colour{new_colour = HEX('8A8A8A'), contrast = 1}
end,
particles = function(self)
G.booster_pack_stars = Particles(1, 1, 0,0, {
timer = 0.07,
scale = 0.1,
initialize = true,
lifespan = 15,
speed = 0.1,
padding = -4,
attach = G.ROOM_ATTACH,
colours = {HEX('E8B6B3'), HEX('82B1CF'), HEX('78B099')},
fill = true
})
end,
group_key = "k_poke_starterq_pack",
}
local pack_list = {pack1, pack2, pack5, pack6, pack3, pack7, pack4, pack8, wish_pack, starter_pack, starterq_pack}
for k, v in pairs(pack_list) do
if not v.ease_background_colour then
v.ease_background_colour = pocket_background
v.particles = pocket_particle
end
end
return {name = "Pocket Packs",
list = pack_list
}
================================================
FILE: challenges/pokechallenges.lua
================================================
local all_cards_enhanced = function(enhancement)
end
local nuzlocke = {
object_type = "Challenge",
key = "nuzlocke",
rules = {
custom = {
{id = 'no_shop_jokers'},
{id = 'all_eternal'},
{id = 'poke_add_joker_slots'},
{id = 'poke_nuzlocke'}
},
modifiers = {
{id = 'joker_slots', value = 1},
}
},
restrictions = {
banned_cards = {
{id = 'c_judgement'},
{id = 'c_wraith'},
{id = 'c_soul'},
{id = 'c_poke_pokeball'},
{id = 'c_poke_greatball'},
{id = 'c_poke_ultraball'},
{id = 'c_poke_masterball'},
{id = 'v_antimatter'},
{id = 'p_buffoon_normal_1', ids = {
'p_buffoon_normal_1','p_buffoon_normal_2','p_buffoon_jumbo_1','p_buffoon_mega_1',
}},
{id = 'j_gros_michel'},
{id = 'j_ice_cream'},
{id = 'j_cavendish'},
{id = 'j_luchador'},
{id = 'j_turtle_bean'},
{id = 'j_diet_cola'},
{id = 'j_popcorn'},
{id = 'j_ramen'},
{id = 'j_selzer'},
{id = 'j_mr_bones'},
{id = 'j_invisible'},
{id = 'j_poke_gastly'},
{id = 'j_poke_haunter'},
{id = 'j_poke_gengar'},
{id = 'j_poke_koffing'},
{id = 'j_poke_weezing'},
{id = 'j_poke_ditto'},
{id = 'j_poke_mewtwo'},
{id = 'j_poke_scyther'},
{id = 'j_poke_scizor'},
{id = 'j_poke_jelly_donut'},
},
banned_tags = {
{id = 'tag_rare'},
{id = 'tag_uncommon'},
{id = 'tag_holo'},
{id = 'tag_polychrome'},
{id = 'tag_negative'},
{id = 'tag_foil'},
{id = 'tag_buffoon'},
{id = 'tag_top_up'},
{id = 'tag_poke_shiny_tag'},
{id = 'tag_poke_stage_one_tag'},
{id = 'tag_poke_safari_tag'},
{id = 'tag_poke_starter_tag'},
},
banned_other = {
{id = 'bl_final_leaf', type = 'blind'},
{id = 'bl_poke_mirror', type = 'blind'}
},
deck = {
type = 'Challenge Deck'
},
},
button_colour = HEX('0064B2'),
text_colour = HEX("FFCB01"),
}
-- add joker slots when ante increases with Nuzlocke
-- todo: insert this in a better spot for mod compat
local ea = ease_ante
function ease_ante(m)
ea(m)
if m > 0 then
if G.GAME.modifiers.poke_add_joker_slots then
G.GAME.poke_slots_added = G.GAME.poke_slots_added or 0
G.GAME.poke_slots_added = G.GAME.poke_slots_added + 1
if G.GAME.poke_slots_added <= 5 then
G.jokers.config.card_limit = G.jokers.config.card_limit + 1
end
end
if G.GAME.modifiers.poke_nuzlocke then
G.GAME.first_shop_buffoon = false
end
end
end
local gp = get_pack
function get_pack(_key, _type)
if G.GAME.modifiers.poke_nuzlocke and not G.GAME.first_shop_buffoon then
G.GAME.first_shop_buffoon = true
return G.P_CENTERS['p_buffoon_normal_'..(math.random(1, 2))]
end
return gp(_key, _type)
end
local goodasgold = {
object_type = "Challenge",
key = "goodasgold",
rules = {
modifiers = {
{id = 'hand_size', value = 6},
{id = 'dollars', value = 6}
}
},
jokers = {
{id = "j_poke_gholdengo", eternal = true},
},
restrictions = {
banned_cards = {
{id = 'j_poke_goldeen'},
{id = 'j_poke_seaking'},
},
banned_tags = {
},
banned_other = {
{id = 'bl_final_leaf', type = 'blind'},
{id = 'bl_poke_mirror', type = 'blind'}
},
},
deck = {
type = 'Challenge Deck',
enhancement = 'm_gold',
},
button_colour = HEX('0064B2'),
text_colour = HEX("FFCB01"),
}
local parenthood = {
object_type = "Challenge",
key = "parenthood",
name = "Parenthood",
rules = {
custom = {
{id = 'no_shop_jokers'},
{id = 'no_interest'}
},
modifiers = {
{id = 'joker_slots', value = 2},
}
},
jokers = {
{id = 'j_poke_mystery_egg'},
{id = 'j_poke_mystery_egg'},
},
consumeables = {
},
vouchers = {
},
deck = {
type = 'Challenge Deck'
},
restrictions = {
banned_cards = {
{id = 'c_judgement'},
{id = 'c_poke_pokeball'},
{id = 'c_poke_greatball'},
{id = 'c_poke_ultraball'},
{id = 'c_poke_masterball'},
{id = 'c_wraith'},
{id = 'c_soul'},
{id = 'v_blank'},
{id = 'v_antimatter'},
{id = 'p_buffoon_normal_1', ids = {
'p_buffoon_normal_1','p_buffoon_normal_2','p_buffoon_jumbo_1','p_buffoon_mega_1',
}},
},
banned_tags = {
{id = 'tag_rare'},
{id = 'tag_uncommon'},
{id = 'tag_holo'},
{id = 'tag_polychrome'},
{id = 'tag_negative'},
{id = 'tag_foil'},
{id = 'tag_buffoon'},
{id = 'tag_top_up'},
{id = 'tag_poke_shiny_tag'},
{id = 'tag_poke_stage_one_tag'},
{id = 'tag_poke_safari_tag'},
{id = 'tag_poke_starter_tag'},
},
banned_other = {
{id = 'bl_final_heart', type = 'blind'},
{id = 'bl_final_leaf', type = 'blind'},
{id = 'bl_poke_mirror', type = 'blind'}
}
},
button_colour = HEX('0064B2'),
text_colour = HEX("FFCB01"),
}
local littlecup = {
object_type = "Challenge",
key = "littlecup",
rules = {
custom = {
{id = 'no_reward_specific', value = 'Small'},
{id = 'no_reward_specific', value = 'Big'},
},
modifiers = {
{id = 'joker_slots', value = 3},
}
},
jokers = {
{id = "j_poke_everstone", eternal = true, edition = 'negative'},
},
restrictions = {
banned_cards = {
},
banned_tags = {
},
banned_other = {
{id = 'bl_poke_mirror', type = 'blind'}
},
},
deck = {
type = 'Challenge Deck',
},
button_colour = HEX('0064B2'),
text_colour = HEX("FFCB01"),
}
local hammertime = {
object_type = "Challenge",
key = "hammertime",
rules = {
modifiers = {
{id = 'hands', value = 2},
{id = 'discards', value = 1},
}
},
jokers = {
{id = "j_poke_tinkaton", eternal = true},
},
restrictions = {
banned_cards = {
},
banned_tags = {
},
banned_other = {
{id = 'bl_poke_mirror', type = 'blind'}
},
},
deck = {
cards = {{s='D',r='2',},{s='D',r='3',},{s='D',r='4',},{s='D',r='5',},{s='D',r='A'},
{s='H',r='2',},{s='H',r='3',},{s='H',r='4',},{s='H',r='5',},{s='H',r='A'},
{s='C',r='2',},{s='C',r='3',},{s='C',r='4',},{s='C',r='5',},{s='C',r='A'},
{s='S',r='2',},{s='S',r='3',},{s='S',r='4',},{s='S',r='5',},{s='S',r='A',e='m_steel'},
},
type = 'Challenge Deck',
},
button_colour = HEX('0064B2'),
text_colour = HEX("FFCB01"),
}
local lonesome = {
object_type = "Challenge",
key = 'lonesome',
rules = {
custom = {
{ id = 'no_shop_jokers' },
},
modifiers = {
{ id = 'joker_slots', value = 1 },
{ id = 'consumable_slots', value = 10 },
}
},
jokers = {
{ id = 'j_poke_cubone', eternal = true},
},
restrictions = {
banned_cards = {
{id = 'c_judgement'},
{id = 'c_wraith'},
{id = 'c_soul'},
{id = 'c_poke_pokeball'},
{id = 'c_poke_greatball'},
{id = 'c_poke_ultraball'},
{id = 'c_poke_masterball'},
{id = 'v_blank'},
{id = 'v_antimatter'},
{id = 'p_buffoon_normal_1', ids = {'p_buffoon_normal_1','p_buffoon_normal_2','p_buffoon_jumbo_1','p_buffoon_mega_1',}},
},
banned_tags = {
{id = 'tag_rare'},
{id = 'tag_uncommon'},
{id = 'tag_holo'},
{id = 'tag_polychrome'},
{id = 'tag_negative'},
{id = 'tag_foil'},
{id = 'tag_buffoon'},
{id = 'tag_top_up'},
{id = 'tag_poke_shiny_tag'},
{id = 'tag_poke_stage_one_tag'},
{id = 'tag_poke_safari_tag'},
{id = 'tag_poke_starter_tag'},
},
banned_other = {
{ id = 'bl_final_heart', type = 'blind' },
{ id = 'bl_final_leaf', type = 'blind' },
{ id = 'bl_final_acorn', type = 'blind' },
{id = 'bl_poke_mirror', type = 'blind'}
}
},
button_colour = HEX('0064B2'),
text_colour = HEX("FFCB01"),
}
local randomizer = {
object_type = "Challenge",
key = "randomizer",
rules = {
custom = {
{ id = 'apply_randomizer' },
},
},
jokers = {
},
restrictions = {
banned_cards = {
},
banned_tags = {
},
banned_other = {
},
},
deck = {
type = 'Challenge Deck',
},
button_colour = HEX('0064B2'),
text_colour = HEX("FFCB01"),
}
local delibird_delimma = {
key = 'delibird_delimma',
rules = {
custom = {
{ id = 'no_reward' },
{ id = 'no_extra_hand_money' },
{ id = 'no_interest' },
}
},
jokers = {
{ id = 'j_poke_delibird', eternal = true},
},
restrictions = {
banned_cards = {
{ id = 'v_seed_money' },
{ id = 'v_money_tree' },
{ id = 'j_to_the_moon' },
{ id = 'j_rocket' },
{ id = 'j_satellite' },
},
banned_other = {
{id = 'bl_poke_mirror', type = 'blind'}
}
},
button_colour = HEX('0064B2'),
text_colour = HEX("FFCB01"),
}
local safety_first = {
key = 'safety_first',
rules = {
custom = {
{ id = 'no_shop_jokers' },
{ id = 'no_energy'}
},
modifiers = {
{ id = 'joker_slots', value = 3 },
}
},
jokers = {
{ id = 'j_poke_mudkip', eternal = true},
{ id = 'j_poke_roggenrola', eternal = true},
{ id = 'j_poke_espeon', eternal = true},
},
restrictions = {
banned_cards = {
{id = 'c_judgement'},
{id = 'c_soul'},
{id = 'c_pluto'},
{id = 'c_black_hole'},
{id = 'c_poke_moonstone'},
{id = 'c_poke_double_rainbow_energy'},
{id = 'c_poke_transformation'},
{id = 'c_poke_teraorb'},
{id = 'c_poke_obituary'},
{id = 'c_poke_nightmare'},
{id = 'c_ankh'},
{id = 'c_hex'},
{id = 'c_wraith'},
{id = 'c_wheel_of_fortune'},
{id = 'c_poke_berry_juice_energy'},
{id = 'c_poke_berry_juice_planet'},
{id = 'c_poke_pokeball'},
{id = 'c_poke_greatball'},
{id = 'c_poke_ultraball'},
{id = 'c_poke_masterball'},
{id = 'c_poke_heavyboots'},
{id = 'v_blank'},
{id = 'v_antimatter'},
{id = 'v_poke_energysearch'},
{id = 'v_poke_energyresearch'},
{id = 'p_buffoon_normal_1', ids = {'p_buffoon_normal_1','p_buffoon_normal_2','p_buffoon_jumbo_1','p_buffoon_mega_1',}},
},
banned_tags = {
{id = 'tag_rare'},
{id = 'tag_uncommon'},
{id = 'tag_holo'},
{id = 'tag_polychrome'},
{id = 'tag_negative'},
{id = 'tag_foil'},
{id = 'tag_buffoon'},
{id = 'tag_top_up'},
{id = 'tag_orbital'},
{id = 'tag_poke_shiny_tag'},
{id = 'tag_poke_stage_one_tag'},
{id = 'tag_poke_safari_tag'},
{id = 'tag_poke_starter_tag'},
},
banned_other = {
{ id = 'bl_final_bell', type = 'blind' },
{ id = 'bl_final_acorn', type = 'blind' },
{id = 'bl_poke_mirror', type = 'blind'},
{id = 'bl_eye', type = 'blind'},
{id = 'bl_club', type = 'blind'},
{id = 'bl_window', type = 'blind'},
{id = 'bl_head', type = 'blind'},
{id = 'bl_goad', type = 'blind'},
{id = 'bl_plant', type = 'blind'},
{id = 'bl_mark', type = 'blind'},
{id = 'bl_poke_gray_godfather', type = 'blind'},
}
},
deck = {
type = 'Challenge Deck',
enhancement = 'm_poke_hazard'
},
button_colour = HEX('0064B2'),
text_colour = HEX("FFCB01"),
}
local mystery_dungeon = {
key = "mystery_dungeon",
rules = {
custom = {
{id = 'poke_mystery_dungeon'},
{id = 'poke_mystery_dungeon2'},
{id = 'poke_mystery_dungeon3'},
},
},
apply = function (self)
G.E_MANAGER:add_event(Event({
func = function()
local target_id = "Pokermon"
local pokermon_decks = {}
for i, v in ipairs(G.P_CENTER_POOLS.Back) do
if v.mod and v.mod.id == target_id and not v.legacy_deck then
pokermon_decks[#pokermon_decks + 1] = v
end
end
local seed = "poke_"..tostring(os.date("!%d%m%Y"))
local deck = pseudorandom_element(pokermon_decks, seed)
if deck then
local deck_key = deck.key
if deck_key == "b_poke_vendingdeck" then
G.GAME.modifiers.vending = true
else
Back(G.P_CENTERS[deck_key]):apply_to_run()
end
G.GAME.poke_mystery_dungeon_deck_key = deck_key
G.E_MANAGER:add_event(Event({
func = function()
play_sound('tarot1')
G.deck.cards[1]:juice_up(0.3, 0.3)
-- Handles drawing the new deck sprite on top of the challenge deck
poke_set_mystery_dungeon_back_sprites()
return true
end
}))
end
local card = SMODS.add_card({area = G.jokers, set = "Joker"})
SMODS.Stickers["eternal"]:apply(card, true)
return true
end
}))
end,
button_colour = HEX('0064B2'),
text_colour = HEX("FFCB01"),
}
return {name = "Challenges",
list = {nuzlocke, goodasgold, parenthood, littlecup, hammertime, lonesome, randomizer, delibird_delimma, safety_first, mystery_dungeon}
}
================================================
FILE: config.lua
================================================
return {
["shiny_playing_cards"]=false,
["detailed_tooltips"]=true,
["precise_energy"]=true,
["pokeballs"]=true,
["no_evos"]=false,
["pokemon_only"]=true,
["pokemon_splash"]=true,
["pokemon_title"]=true,
["pokemon_num"]=true,
["unlimited_energy"]=false,
["jokers_only"]=false,
["gen_one"]=true,
["gen_oneb"]=true,
["gen_two"]=true,
["gen_three"]=true,
["gen_four"]=true,
["gen_five"]=true,
["gen_six"]=true,
["gen_seven"]=true,
["gen_eight"]=true,
["gen_nine"]=true,
["hazards_on"]=true,
["pokemon_discovery"]=true,
["pokemon_altart"]=true,
["previous_evo_stickers"]=true,
["poke_enable_animations"]=true,
["pokemon_aprilfools"]=false,
["pokemon_legacy"]=false,
["pokemon_spritesheet_id"]=2,
["pokemon_spritesheet_atlas"]="SeriesA",
["pokemon_spritesheet_overrides"] = {}
}
================================================
FILE: consumable types/type1.lua
================================================
local energy = {
key = "Energy",
primary_colour = HEX("4F6367"),
secondary_colour = HEX("4ABA8D"),
loc_txt = {
name = 'Energy', -- used on card type badges
collection = 'Energy Cards', -- label for the button to access the collection
},
collection_row = {6, 6},
shop_rate = 2,
default = "c_poke_grass_energy"
}
local item = {
key = "Item",
primary_colour = HEX("4F6367"),
secondary_colour = HEX("9AA4B7"),
loc_txt = {
name = 'Item', -- used on card type badges
collection = 'Item Cards', -- label for the button to access the collection
},
collection_row = {6, 6},
shop_rate = 4,
default = "c_poke_pokeball"
}
return {name = "Pokemon Consumable Types",
list = {energy, item}
}
================================================
FILE: consumables/00_mart_balls.lua
================================================
local pokeball = {
name = "pokeball",
key = "pokeball",
set = "Item",
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'basic'}
end,
pos = { x = 0, y = 3 },
atlas = "AtlasConsumablesBasic",
cost = 3,
pokeball = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if #G.jokers.cards < G.jokers.config.card_limit or self.area == G.jokers then
return true
else
return false
end
end,
use = function(self, card, area, copier)
set_spoon_item(card)
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function()
play_sound('timpani')
local _card = create_random_poke_joker("pokeball", "Basic")
_card:add_to_deck()
G.jokers:emplace(_card)
return true end }))
delay(0.6)
end
}
local greatball = {
name = "greatball",
key = "greatball",
set = "Item",
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'stage1'}
end,
pos = { x = 1, y = 3 },
atlas = "AtlasConsumablesBasic",
cost = 4,
pokeball = true,
hidden = true,
soul_set = "Tarot",
soul_rate = .025,
unlocked = true,
discovered = true,
can_use = function(self, card)
if #G.jokers.cards < G.jokers.config.card_limit or self.area == G.jokers then
return true
else
return false
end
end,
use = function(self, card, area, copier)
set_spoon_item(card)
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function()
play_sound('timpani')
local _card = create_random_poke_joker("greatball", "One")
_card:add_to_deck()
G.jokers:emplace(_card)
return true end }))
delay(0.6)
end
}
local ultraball = {
name = "ultraball",
key = "ultraball",
set = "Spectral",
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'stage2'}
end,
pos = { x = 2, y = 3 },
atlas = "AtlasConsumablesBasic",
cost = 4,
pokeball = true,
hidden = true,
soul_set = "Item",
soul_rate = .01,
unlocked = true,
discovered = true,
can_use = function(self, card)
if #G.jokers.cards < G.jokers.config.card_limit or self.area == G.jokers then
return true
else
return false
end
end,
use = function(self, card, area, copier)
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function()
play_sound('timpani')
local _card = create_random_poke_joker("ultraball", "Two")
_card:add_to_deck()
G.jokers:emplace(_card)
return true end }))
delay(0.6)
end
}
local masterball = {
name = "masterball",
key = "masterball",
set = "Spectral",
pos = { x = 3, y = 3 },
soul_pos = { x = 4, y = 2},
atlas = "AtlasConsumablesBasic",
cost = 4,
pokeball = true,
hidden = true,
soul_set = "Item",
soul_rate = .003,
unlocked = true,
discovered = true,
can_use = function(self, card)
if #G.jokers.cards < G.jokers.config.card_limit or self.area == G.jokers then
return true
else
return false
end
end,
use = function(self, card, area, copier)
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function()
play_sound('timpani')
local _card = create_random_poke_joker("masterball", "Legendary")
_card:add_to_deck()
G.jokers:emplace(_card)
return true end }))
delay(0.6)
end
}
local list = {pokeball, greatball, ultraball, masterball,}
return {name = "AtlasConsumablesBasic 0",
list = list
}
================================================
FILE: consumables/01_mart_energy.lua
================================================
-- We can initialize the 12 basic energies (not bird) with this template and a good for loop
local energy_template = {
set = "Energy",
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'energize'}
return {vars = {(pokermon_config.unlimited_energy and localize("poke_unlimited_energy")) or energy_max + (G.GAME.energy_plus or 0)}}
end,
pos = { x = 0, y = 0 },
atlas = "AtlasConsumablesBasic",
cost = 4,
unlocked = true,
discovered = true,
can_use = function(self, card)
return energy_can_use(self, card)
end,
use = function(self, card, area, copier)
return energy_use(self, card, area, copier)
end
}
local basic_etypes = {"Grass", "Fire", "Water", "Lightning", "Psychic", "Fighting", "Colorless", "Dark", "Metal", "Fairy", "Dragon", "Earth"}
local basic_energies = {}
for k, etype in ipairs(basic_etypes) do
local energy = copy_table(energy_template)
energy.key = etype == 'Dark' and string.lower(etype) .. 'ness_energy' or string.lower(etype) .. '_energy'
energy.etype = etype
energy.pos = { x = (k - 1) % 10, y = math.floor((k - 1) / 10) }
table.insert(basic_energies, energy)
end
local bird_energy = {
name = "bird_energy",
key = "bird_energy",
set = "Energy",
animated = true,
artist = "Catzzadilla",
pos = { x = 0, y = 0 },
atlas = "AtlasConsumablesBirdEnergy",
cost = 4,
etype = "Bird",
no_collection = true,
unlocked = true,
discovered = true,
loc_vars = function(self, info_queue, card)
local r_mults = {}
for i = 1, 23 do
r_mults[#r_mults + 1] = tostring(i)
end
local gives_strings = {{ string = localize('poke_water_gun_ex'), colour = G.ARGS.LOC_COLOURS.water }, { string = localize('poke_sky_attack_ex'), colour = G.ARGS.LOC_COLOURS.colorless },
{ string = 'HEX("FF7ABF")', colour = G.C.JOKER_GREY}, { string = '?????', colour = G.C.JOKER_GREY}
}
local energy_strings = {{ string = '?????', colour = G.C.JOKER_GREY}, { string = self.name, colour = G.C.JOKER_GREY}, { string = localize('k_poke_pp'), colour = G.C.JOKER_GREY},
{ string = localize('k_mult'), colour = G.C.MULT}, { string = 'ERROR', colour = G.C.CHIPS}
}
local energy_strings2 = {{ string = '?????', colour = G.C.JOKER_GREY}, { string = self.name, colour = G.C.JOKER_GREY}, { string = localize('k_poke_pp'), colour = G.C.JOKER_GREY},
{ string = localize('k_mult'), colour = G.C.MULT}, { string = 'ERROR', colour = G.C.CHIPS}
}
main_start = {
{n = G.UIT.R,
config = {
align = "cm",
padding = 0.05,
colour = G.C.CLEAR,
},
nodes = {
{ n = G.UIT.O, config = { object = DynaText(poke_random_text(gives_strings, {poke_rep_string = localize('k_poke_gives'), poke_rep_num = 5})) } },
{ n = G.UIT.T, config = { text = ' +'..(energy_max + (G.GAME.energy_plus or 0))..' ', colour = HEX("FF7ABF"), scale = 0.32 } },
{ n = G.UIT.O, config = { object = DynaText(poke_random_text(energy_strings, {poke_rep_string = localize('k_energy'), poke_rep_num = 5})) } },
}
},
{n = G.UIT.R,
config = {
align = "cm",
padding = 0.05,
colour = G.C.CLEAR,
},
nodes = {
{ n = G.UIT.T, config = { text = '('..localize('k_poke_ignores')..' ', colour = G.C.JOKER_GREY, scale = 0.32 } },
{ n = G.UIT.O, config = { object = DynaText(poke_random_text(energy_strings2, {poke_rep_string = localize('k_energy'), poke_rep_num = 5})) } },
{ n = G.UIT.T, config = { text = ' '..localize('k_poke_limit')..')', colour = G.C.JOKER_GREY, scale = 0.32 } },
}
},
}
return { main_start = main_start }
end,
can_use = function(self, card)
return energy_can_use(self, card)
end,
use = function(self, card, area, copier)
local choice = energy_can_use(self, card)
if choice then
increment_energy(choice, self.etype, energy_max + (G.GAME.energy_plus or 0))
end
G.GAME.energies_used = G.GAME.energies_used and (G.GAME.energies_used + 1) or 1
end,
in_pool = function(self)
return false
end
}
local double_rainbow_energy = {
name = "double_rainbow_energy",
key = "double_rainbow_energy",
set = "Spectral",
artist = "MyDude_YT",
config = {},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'energize'}
return {vars = {(pokermon_config.unlimited_energy and localize("poke_unlimited_energy")) or energy_max + (G.GAME.energy_plus or 0)}}
end,
pos = { x = 0, y = 6 },
atlas = "AtlasConsumablesBasic",
cost = 4,
etype = "Trans",
unlocked = true,
discovered = true,
can_use = function(self, card)
return energy_can_use(self, card)
end,
use = function(self, card, area, copier)
G.GAME.energies_used = G.GAME.energies_used and (G.GAME.energies_used + 1) or 1
local choice = poke_find_leftmost_or_highlighted(function(joker) return can_apply_energy(joker, self.etype) end)
for _ = 1, 2 do
energy_increase(choice, self.etype)
end
if not G.GAME.modifiers.no_interest then
G.GAME.modifiers.reset_no_interest = true
G.GAME.modifiers.no_interest = true
end
end
}
local emergy = {
name = "emergy",
key = "emergy",
set = "Energy",
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {key = 'e_negative_consumable', set = 'Edition', config = {extra = 1}}
end,
pos = { x = 3, y = 1 },
atlas = "AtlasConsumablesBasic",
cost = 4,
hidden = true,
soul_set = "Energy",
soul_rate = .01,
unlocked = true,
discovered = true,
use = function(self, card)
--Code taken from Cryptid
local jollycount = 0
for i = 1, #G.jokers.cards do
if
-- is_jolly() is a cryptid function. It's basically a better Jolly Joker check -Jevonn
G.jokers.cards[i]:is_jolly()
or G.jokers.cards[i].ability.effect == "M Joker"
then
jollycount = jollycount + 1
end
end
for i= 1, jollycount do
local _card = create_card("Energy", G.consumeables, nil, nil, nil, nil, nil, nil)
local edition = {negative = true}
_card:set_edition(edition, true)
_card:add_to_deck()
G.consumeables:emplace(_card)
end
end,
can_use = function(self, card)
return true
end,
in_pool = function(self)
--another Cryptid Function, This checks for M jokers -Jevonn
local mcheck = 0
if get_m_jokers then
mcheck = get_m_jokers()
elseif Cryptid and Cryptid.get_m_jokers then
mcheck = Cryptid.get_m_jokers()
end
if (mcheck + #find_joker('Jolly Joker')) > 0 then
return true
end
return false
end,
}
local list = {bird_energy, double_rainbow_energy}
-- Keeping the order of consumables the same as before, the 12 energies get added after masterball
for i = 1, #basic_energies do
table.insert(list, i, basic_energies[i])
end
if (SMODS.Mods["Cryptid"] or {}).can_load then
table.insert(list, emergy)
end
return {name = "AtlasConsumablesBasic 1",
list = list
}
================================================
FILE: consumables/02_mart_spectral.lua
================================================
local transformation = {
name = "transformation",
key = "transformation",
set = "Spectral",
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'energize'}
return {vars = {(pokermon_config.unlimited_energy and localize("poke_unlimited_energy")) or energy_max + (G.GAME.energy_plus or 0)}}
end,
pos = { x = 2, y = 1 },
atlas = "AtlasConsumablesBasic",
cost = 4,
etype = "Trans",
hidden = true,
soul_set = "Energy",
soul_rate = .025,
unlocked = true,
discovered = true,
can_use = function(self, card)
local choice = poke_find_leftmost_or_highlighted()
return choice and get_type(choice) or false
end,
use = function(self, card, area, copier)
local choice = poke_find_leftmost_or_highlighted()
if get_type(choice) then energy_increase(choice, get_type(choice)) end
if not choice.config.center.aux_poke then
local highest = get_highest_evo(choice)
if highest and type(highest) == "string" then
local prefix = choice.config.center.poke_custom_prefix or "poke"
local forced_key = "j_"..prefix.."_"..highest
local context = {}
poke_evolve(choice, forced_key)
end
end
end
}
local get_mega_target = function(self)
return poke_find_leftmost_or_highlighted(function(joker)
return not self.ability.extra.used_on and get_mega(joker) and not joker.debuff
or joker.config.center.rarity == "poke_mega" and joker.unique_val == self.ability.extra.used_on
or G.GAME.modifiers.infinite_megastone and ((get_mega(joker) and not joker.debuff) or joker.config.center.rarity == "poke_mega")
end)
end
local megastone = {
name = "megastone",
key = "megastone",
set = "Spectral",
artist = "MyDude_YT",
helditem = true,
saveable = true,
config = {extra = {usable = true, used_on = nil}},
loc_vars = function(self, info_queue, card)
info_queue[#info_queue + 1] = { set = 'Other', key = 'endless' }
if not G.GAME.modifiers.infinite_megastone then
info_queue[#info_queue+1] = {set = 'Other', key = 'mega_rule'}
end
local joker = poke_find_card(function(joker)
return joker.config.center.rarity == "poke_mega" and joker.unique_val == card.ability.extra.used_on
end)
if joker then
info_queue[#info_queue+1] = {set = 'Other', key = 'mega_used_on', vars = {localize({ type = "name_text", set = "Joker", key = joker.config.center.key})}}
end
end,
pos = { x = 4, y = 5 },
atlas = "AtlasConsumablesBasic",
cost = 4,
hidden = true,
soul_set = "Item",
soul_rate = .005,
unlocked = true,
discovered = true,
can_use = function(self, card)
-- location-based usability checks
if (#G.consumeables.cards + G.GAME.consumeable_buffer >= G.consumeables.config.card_limit) and card.area == G.pack_cards then return false end
if card.area == G.shop_jokers then return false end
if not (G.jokers and G.jokers.cards) or #G.jokers.cards == 0 then return false end
if not card.ability.extra.usable then return false end
-- Find an eligible pokemon (also checks if the mega stone has been used, and on which joker)
local target = get_mega_target(card)
if not target then return false end
-- If none of that nonsense happened you can use it I guess
return true
end,
use = function(self, card, area, copier)
local target = get_mega_target(card)
local forced_key
local prefix = target.config.center.poke_custom_prefix or "poke"
if get_mega(target) then
forced_key = "j_"..prefix.."_"..get_mega(target)
card.ability.extra.used_on = not G.GAME.modifiers.infinite_megastone and target.unique_val
else
forced_key = get_previous_evo(target, true)
card.ability.extra.used_on = nil
end
card.ability.extra.usable = false
poke_evolve(target, forced_key)
end,
calculate = function(self, card, context)
if context.end_of_round then
local mega = poke_find_card(function(joker) return joker.config.center.rarity == "poke_mega" and joker.unique_val == card.ability.extra.used_on end)
if not mega then card.ability.extra.used_on = nil end
if not card.ability.extra.usable then
card.ability.extra.usable = true
card_eval_status_text(card, 'extra', nil, nil, nil, {message = localize('k_reset')})
end
end
end,
keep_on_use = function(self, card)
return true
end,
in_pool = function(self)
local mega_poke = G.jokers and poke_find_card(function(joker) return joker.config.center.megas end)
return mega_poke
end,
add_to_deck = function(self, card, from_debuff)
if not from_debuff then card.ability.extra.used_on = nil end
card.ability.extra.usable = true
end,
remove_from_deck = function(self, card, from_debuff)
local target = poke_find_card(function(joker) return joker.config.center.rarity == "poke_mega" and joker.unique_val == card.ability.extra.used_on end)
if target then
local forced_key = get_previous_evo(target, true)
poke_evolve(target, forced_key)
end
end,
}
local obituary = {
name = "obituary",
key = "obituary",
set = "Spectral",
config = {extra = "Pink", max_highlighted = 1},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {key = 'poke_pink_seal_seal', set = 'Other'}
end,
pos = { x = 1, y = 4 },
atlas = "AtlasConsumablesBasic",
cost = 4,
unlocked = true,
discovered = true,
use = function(self, card)
local conv_card = G.hand.highlighted[1]
G.E_MANAGER:add_event(Event({func = function()
play_sound('tarot1')
return true end }))
G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function()
conv_card:set_seal("poke_pink_seal", nil, true)
return true end }))
delay(0.5)
poke_unhighlight_cards()
end,
}
local revenant = {
name = "revenant",
key = "revenant",
set = "Spectral",
config = {extra = "Silver", max_highlighted = 1},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {key = 'poke_silver_seal', set = 'Other'}
end,
pos = { x = 2, y = 5 },
atlas = "AtlasConsumablesBasic",
cost = 4,
unlocked = true,
discovered = true,
use = function(self, card)
local conv_card = G.hand.highlighted[1]
G.E_MANAGER:add_event(Event({func = function()
play_sound('tarot1')
return true end }))
G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function()
conv_card:set_seal("poke_silver", nil, true)
return true end }))
delay(0.5)
poke_unhighlight_cards()
end,
}
local nightmare = {
name = "nightmare",
key = "nightmare",
set = "Spectral",
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {key = 'e_negative_consumable', set = 'Edition', config = {extra = 1}}
end,
pos = { x = 0, y = 4 },
atlas = "AtlasConsumablesBasic",
cost = 3,
unlocked = true,
discovered = true,
use = function(self, card)
local choice = poke_find_leftmost_or_highlighted()
if choice then
local energy = matching_energy(choice, true) or "c_poke_colorless_energy"
if energy then
local max = (energy == "c_poke_bird_energy") and 1 or 2
for _ = 1, max do
local _card = SMODS.add_card({set = "Energy", area = G.consumeables, key = energy, skip_materialize = true, soulable = true})
_card:set_edition({negative = true}, true)
end
end
remove(self, choice)
end
end,
can_use = function(self, card)
local choice = poke_find_leftmost_or_highlighted()
return choice and not choice.ability.eternal
end,
}
local list = {obituary, revenant, nightmare, transformation, megastone}
return {name = "AtlasConsumablesBasic 2",
list = list
}
================================================
FILE: consumables/03_mart_items.lua
================================================
local twisted_spoon = {
name = "twisted_spoon",
key = "twisted_spoon",
set = "Item",
pos = { x = 1, y = 5 },
atlas = "AtlasConsumablesBasic",
cost = 4,
unlocked = true,
discovered = true,
can_use = function(self, card)
if (#G.consumeables.cards < G.consumeables.config.card_limit or card.area == G.consumeables) and G.GAME.last_poke_item and G.GAME.last_poke_item ~= 'c_poke_twisted_spoon'
and G.GAME.last_poke_item ~= 'c_poke_leftovers' and G.GAME.last_poke_item ~= 'c_poke_leek' and G.GAME.last_poke_item ~= 'c_poke_thickclub' then
return true
end
return false
end,
use = function(self, card, area, copier)
set_spoon_item(card)
local used_item = copier or card
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function()
if G.consumeables.config.card_limit > #G.consumeables.cards then
play_sound('timpani')
local _card = create_card('Item', G.consumeables, nil, nil, nil, nil, G.GAME.last_poke_item, 'spoon')
_card:add_to_deck()
G.consumeables:emplace(_card)
used_item:juice_up(0.3, 0.5)
end
return true end }))
delay(0.6)
end,
in_pool = function(self)
return true
end,
generate_ui = function(self, info_queue, card, desc_nodes, specific_vars, full_UI_table)
local _c = card and card.config.center or self
if not full_UI_table.name then
full_UI_table.name = localize({ type = "name", set = _c.set, key = _c.key, nodes = full_UI_table.name })
end
local spoon_c = G.GAME.last_poke_item and G.P_CENTERS[G.GAME.last_poke_item] or nil
local last_poke_item = spoon_c and localize{type = 'name_text', key = spoon_c.key, set = spoon_c.set} or localize('k_none')
local colour = (not spoon_c or spoon_c.name == 'twisted_spoon' or spoon_c.name == 'leftovers' or spoon_c.name == 'leek' or spoon_c.name == 'thickclub') and G.C.RED or G.C.GREEN
local main_end = {
{n=G.UIT.C, config={align = "bm", padding = 0.02}, nodes={
{n=G.UIT.C, config={align = "m", colour = colour, r = 0.05, padding = 0.05}, nodes={
{n=G.UIT.T, config={text = ' '..last_poke_item ..' ', colour = G.C.UI.TEXT_LIGHT, scale = 0.3, shadow = true}},
}}
}}
}
local loc_vars = {last_poke_item}
if not (not spoon_c or (spoon_c.name == 'twisted_spoon')) then
info_queue[#info_queue+1] = spoon_c
end
localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars}
desc_nodes[#desc_nodes+1] = main_end
end,
add_to_deck = function(self, card, from_debuff)
if G.GAME.modifiers.spoon_slots then
G.E_MANAGER:add_event(Event({
func = function()
G.consumeables.config.card_limit = G.consumeables.config.card_limit + 1
return true
end
}))
end
end,
remove_from_deck = function(self, card, from_debuff)
if G.GAME.modifiers.spoon_slots then
G.E_MANAGER:add_event(Event({
func = function()
G.consumeables.config.card_limit = G.consumeables.config.card_limit - 1
return true
end
}))
end
end,
}
local firestone = {
name = "firestone",
key = "firestone",
set = "Item",
config = {max_highlighted = 4, min_highlighted = 4},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
info_queue[#info_queue+1] = G.P_CENTERS.m_mult
return {vars = {self.config.max_highlighted}}
end,
pos = { x = 4, y = 3 },
atlas = "AtlasConsumablesBasic",
cost = 4,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.jokers.highlighted and #G.jokers.highlighted == 1 and is_evo_item_for(self, G.jokers.highlighted[1]) then
return true
end
if G.hand.highlighted and #G.hand.highlighted == 4 then
return true
end
return false
end,
use = function(self, card, area, copier)
set_spoon_item(card)
if G.hand.highlighted and #G.hand.highlighted == 4 then
juice_flip(card)
for i = 1, #G.hand.highlighted do
G.hand.highlighted[i]:set_ability(G.P_CENTERS.m_mult, nil, true)
end
juice_flip(card, true)
local target = pseudorandom_element(G.hand.highlighted, pseudoseed('firestone'))
poke_remove_card(target, card)
poke_unhighlight_cards()
evo_item_use_total(self, card, area, copier)
else
highlighted_evo_item(self, card, area, copier)
end
end,
in_pool = function(self)
return true
end
}
local waterstone = {
name = "waterstone",
key = "waterstone",
set = "Item",
config = {max_highlighted = 1, max_chips = 50},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
info_queue[#info_queue+1] = G.P_CENTERS.m_bonus
return {vars = {self.config.max_highlighted, self.config.max_chips}}
end,
pos = { x = 5, y = 3 },
atlas = "AtlasConsumablesBasic",
cost = 4,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.jokers.highlighted and #G.jokers.highlighted == 1 and is_evo_item_for(self, G.jokers.highlighted[1]) then
return true
end
if G.hand.highlighted and #G.hand.highlighted == 1 then
return true
end
return false
end,
use = function(self, card, area, copier)
set_spoon_item(card)
if G.hand.highlighted and #G.hand.highlighted == 1 then
local conv_card = G.hand.highlighted[1]
juice_flip(card)
if conv_card.ability.name == 'Bonus' then
local bonus = math.min(self.config.max_chips, poke_total_chips(conv_card))
conv_card.ability.perma_bonus = conv_card.ability.perma_bonus or 0
conv_card.ability.perma_bonus = conv_card.ability.perma_bonus + bonus
else
conv_card:set_ability(G.P_CENTERS.m_bonus, nil, true)
end
juice_flip(card, true)
delay(0.5)
poke_unhighlight_cards()
evo_item_use_total(self, card, area, copier)
else
highlighted_evo_item(self, card, area, copier)
end
end,
in_pool = function(self)
return true
end
}
local thunderstone = {
name = "thunderstone",
key = "thunderstone",
set = "Item",
config = {max_highlighted = 1},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
return {vars = {self.config.max_highlighted}}
end,
pos = { x = 6, y = 3 },
atlas = "AtlasConsumablesBasic",
cost = 4,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.jokers.highlighted and #G.jokers.highlighted == 1 and is_evo_item_for(self, G.jokers.highlighted[1]) then
return true
end
if G.hand.highlighted and #G.hand.highlighted == 1 then
return true
end
return false
end,
use = function(self, card, area, copier)
set_spoon_item(card)
if G.hand.highlighted and #G.hand.highlighted == 1 then
local selected = G.hand.highlighted[1]
local poss_cards = {}
for _, v in pairs(G.P_CARDS) do
if v.value == selected.base.value then
table.insert(poss_cards, v)
end
end
local cards_added = {}
for i = 1, 2 do
local area = i == 1 and G.hand or G.deck
local _card = create_playing_card({
front = pseudorandom_element(poss_cards, pseudoseed('thunderstone')),
center = G.P_CENTERS.m_gold}, area, nil, nil, {G.C.SECONDARY_SET.Enhanced})
cards_added[#cards_added + 1] = _card
end
playing_card_joker_effects(cards_added)
poke_remove_card(selected, card)
evo_item_use_total(self, card, area, copier)
else
highlighted_evo_item(self, card, area, copier)
end
end,
in_pool = function(self)
return true
end
}
local leafstone = {
name = "leafstone",
key = "leafstone",
set = "Item",
config = {num = 1, dem = 3},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = G.P_CENTERS.m_lucky
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
local num, dem = SMODS.get_probability_vars(center, self.config.num, self.config.dem, 'leafstone')
return {vars = {num, dem}}
end,
pos = { x = 7, y = 3 },
atlas = "AtlasConsumablesBasic",
cost = 4,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.jokers.highlighted and #G.jokers.highlighted == 1 and is_evo_item_for(self, G.jokers.highlighted[1]) then
return true
end
return G.hand.cards and #G.hand.cards > 0
end,
use = function(self, card, area, copier)
set_spoon_item(card)
if G.hand.cards and #G.hand.cards > 0 then
juice_flip_hand(card)
for i = 1, #G.hand.cards do
if SMODS.pseudorandom_probability(card, 'leafstone', self.config.num, self.config.dem, 'leafstone') then
G.hand.cards[i]:set_ability(G.P_CENTERS.m_lucky, nil, true)
end
end
juice_flip_hand(card, true)
poke_unhighlight_cards()
evo_item_use_total(self, card, area, copier)
else
highlighted_evo_item(self, card, area, copier)
end
end,
in_pool = function(self)
return true
end
}
local moonstone = {
name = "moonstone",
key = "moonstone",
set = "Item",
config = {min_highlighted = 1, num = 1, dem = 2},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
local handtext = localize('poke_none')
if G.hand and G.hand.highlighted and #G.hand.highlighted > 0 then
local text,disp_text,poker_hands,scoring_hand,non_loc_disp_text = G.FUNCS.get_poker_hand_info(G.hand.highlighted)
handtext = localize(text, 'poker_hands') or localize('poke_none')
for k, v in pairs(G.hand.highlighted) do
if v.facing == "back" then
handtext = "????"
break
end
end
end
local num, dem = SMODS.get_probability_vars(center, self.config.num, self.config.dem, 'moonstone')
return {vars = {handtext, num, dem}}
end,
pos = { x = 8, y = 3 },
atlas = "AtlasConsumablesBasic",
cost = 4,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.jokers.highlighted and #G.jokers.highlighted == 1 and is_evo_item_for(self, G.jokers.highlighted[1]) then
return true
end
if G.hand.highlighted and #G.hand.highlighted >= self.config.min_highlighted then
return true
end
return false
end,
use = function(self, card, area, copier)
set_spoon_item(card)
if #G.hand.highlighted >= self.config.min_highlighted then
if SMODS.pseudorandom_probability(card, 'moonstone', self.config.num, self.config.dem, 'moonstone') then
local hand = G.FUNCS.get_poker_hand_info(G.hand.highlighted)
SMODS.smart_level_up_hand(card, hand)
else
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function()
attention_text({
text = localize('k_nope_ex'),
scale = 1.3,
hold = 1.4,
major = card,
backdrop_colour = G.C.SECONDARY_SET.Tarot,
align = (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK) and 'tm' or 'cm',
offset = {x = 0, y = (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK) and -0.2 or 0},
silent = true
})
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, func = function()
play_sound('tarot2', 0.76, 0.4);return true end}))
play_sound('tarot2', 1, 0.4)
card:juice_up(0.3, 0.5)
return true end }))
end
poke_unhighlight_cards()
evo_item_use_total(self, card, area, copier)
else
highlighted_evo_item(self, card, area, copier)
end
end,
in_pool = function(self)
return true
end
}
local sunstone = {
name = "sunstone",
key = "sunstone",
set = "Item",
config = {max_highlighted = 2, min_highlighted = 1},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
info_queue[#info_queue+1] = G.P_CENTERS.m_wild
return {vars = {self.config.max_highlighted}}
end,
pos = { x = 9, y = 3 },
atlas = "AtlasConsumablesBasic",
cost = 4,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.jokers.highlighted and #G.jokers.highlighted == 1 and is_evo_item_for(self, G.jokers.highlighted[1]) then
return true
end
if G.hand.highlighted and #G.hand.highlighted >= self.config.min_highlighted and #G.hand.highlighted <= self.config.max_highlighted then
return true
end
return false
end,
use = function(self, card, area, copier)
set_spoon_item(card)
if G.hand.highlighted and #G.hand.highlighted >= self.config.min_highlighted then
juice_flip(card)
for i = 1, #G.hand.highlighted do
G.hand.highlighted[i]:set_ability(G.P_CENTERS.m_wild, nil, true)
poke_vary_rank(G.hand.highlighted[i], nil, "sunstone")
end
juice_flip(card, true)
poke_unhighlight_cards()
evo_item_use_total(self, card, area, copier)
else
highlighted_evo_item(self, card, area, copier)
end
end,
in_pool = function(self)
return true
end
}
local shinystone = {
name = "shinystone",
key = "shinystone",
set = "Item",
config = {max_highlighted = 1},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = G.P_CENTERS.e_foil
info_queue[#info_queue+1] = G.P_CENTERS.e_holo
info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
return {vars = {self.config.max_highlighted, self.config.drain_amt}}
end,
pos = { x = 2, y = 4 },
atlas = "AtlasConsumablesBasic",
cost = 4,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.jokers.highlighted and #G.jokers.highlighted == 1 and is_evo_item_for(self, G.jokers.highlighted[1]) then
return true
end
if G.hand.highlighted and #G.hand.highlighted == 1 then
return true
end
return false
end,
use = function(self, card, area, copier)
set_spoon_item(card)
if #G.hand.highlighted == 1 then
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function()
local over = false
local edition = poll_edition('aura', nil, true, true)
local shiny_card = G.hand.highlighted[1]
shiny_card:set_edition(edition, true)
shiny_card:set_ability(G.P_CENTERS.c_base, nil, true)
card:juice_up(0.3, 0.5)
return true end }))
poke_unhighlight_cards()
evo_item_use_total(self, card, area, copier)
else
highlighted_evo_item(self, card, area, copier)
end
end,
in_pool = function(self)
return true
end
}
local duskstone = {
name = "duskstone",
key = "duskstone",
set = "Item",
config = {extra = {money = 4, max = 30, round_target = 3, rounds = 0}},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
info_queue[#info_queue+1] = {set = 'Other', key = 'poke_drain_item'}
local card_info = center and center.ability.extra or self.config.extra
local jokers = (G.jokers and G.jokers.cards) and #G.jokers.cards or 0
local joker_count = 0
for i = 1, jokers do
if G.jokers.cards[i].sell_cost > 1 or ((card_info.round_target - card_info.rounds) <= 0) then
joker_count = joker_count + 1
end
end
return {vars = {card_info.money, card_info.round_target, math.max(0, card_info.round_target - card_info.rounds), math.min(card_info.max, card_info.money * joker_count), card_info.max,}}
end,
pos = { x = 3, y = 4 },
atlas = "AtlasConsumablesBasic",
cost = 3,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
return true
end,
use = function(self, card, area, copier)
set_spoon_item(card)
local joker_count = 0
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].sell_cost > 1 or ((card.ability.extra.round_target - card.ability.extra.rounds) <= 0) then
joker_count = joker_count + 1
if not ((card.ability.extra.round_target - card.ability.extra.rounds) <= 0) then
poke_drain(card, G.jokers.cards[i], 1, true)
end
end
end
local money = math.min(card.ability.extra.max, card.ability.extra.money * joker_count)
ease_dollars(money)
evo_item_use_total(self, card, area, copier)
end,
calculate = function(self, card, context)
if context.setting_blind and not context.blueprint then
card.ability.extra.rounds = card.ability.extra.rounds + 1
end
end,
update = function(self, card, dt)
if G.STAGE == G.STAGES.RUN then
if ((card.ability.extra.round_target - card.ability.extra.rounds) <= 0) and not card.ability.extra.juiced then
card.ability.extra.juiced = true
local eval = function(card) return not card.REMOVED and not G.RESET_JIGGLES end
juice_card_until(card, eval, true)
end
end
end,
in_pool = function(self)
return true
end
}
local dawnstone = {
name = "dawnstone",
key = "dawnstone",
set = "Item",
config = {extra = {hand_played = nil, money_limit = 40}},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
local money = 0
local message = localize('poke_dawn_info2')
local hand_played = center and center.ability.extra.hand_played or self.config.extra.hand_played
local money_limit = center and center.ability.extra.money_limit or self.config.extra.money_limit
if hand_played then
local mult = nil
if (SMODS.Mods["Talisman"] or {}).can_load then
mult = to_big(G.GAME.hands[hand_played].mult)
money = mult * 2
if to_big(money) > to_big(money_limit) then
money = money_limit
end
elseif not (SMODS.Mods["Talisman"] or {}).can_load then
mult = G.GAME.hands[hand_played].mult
money = mult * 2
end
end
if not hand_played then
message = localize('poke_dawn_info1')
end
return {vars = {hand_played and localize(hand_played, 'poker_hands') or localize('poke_none'), math.min(money_limit, money), money_limit, message}}
end,
pos = { x = 4, y = 4 },
atlas = "AtlasConsumablesBasic",
cost = 3,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.jokers.highlighted and #G.jokers.highlighted == 1 and is_evo_item_for(self, G.jokers.highlighted[1]) then
return true
end
return card.ability.extra.hand_played
end,
use = function(self, card, area, copier)
set_spoon_item(card)
if card.ability.extra.hand_played then
local money = 0
local hand_played = card.ability.extra.hand_played
local money_limit = card.ability.extra.money_limit
if hand_played then
local mult = nil
if (SMODS.Mods["Talisman"] or {}).can_load then
mult = to_big(G.GAME.hands[hand_played].mult)
money = mult * 2
if to_big(money) > to_big(money_limit) then
ease_dollars(money_limit)
else
ease_dollars(to_number(money))
end
elseif not (SMODS.Mods["Talisman"] or {}).can_load then
mult = G.GAME.hands[hand_played].mult
money = mult * 2
money = math.min(money, money_limit)
ease_dollars(money)
end
end
evo_item_use_total(self, card, area, copier)
else
highlighted_evo_item(self, card, area, copier)
end
end,
calculate = function(self, card, context)
if context.cardarea == G.jokers and context.scoring_hand then
if context.joker_main and not card.ability.extra.hand_played then
card.ability.extra.hand_played = context.scoring_name
card:juice_up()
end
end
end,
in_pool = function(self)
return true
end
}
local icestone = {
name = "icestone",
key = "icestone",
set = "Item",
config = {max_highlighted = 2, min_highlighted = 1, num = 1, dem = 4},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
info_queue[#info_queue+1] = G.P_CENTERS.m_glass
local num, dem = SMODS.get_probability_vars(center, self.config.num, self.config.dem, 'icestone')
return {vars = {self.config.max_highlighted, num, dem}}
end,
pos = { x = 5, y = 4 },
atlas = "AtlasConsumablesBasic",
cost = 4,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.jokers.highlighted and #G.jokers.highlighted == 1 and is_evo_item_for(self, G.jokers.highlighted[1]) then
return true
end
if G.hand.highlighted and #G.hand.highlighted >= self.config.min_highlighted and #G.hand.highlighted <= self.config.max_highlighted then
return true
end
return false
end,
use = function(self, card, area, copier)
set_spoon_item(card)
if #G.hand.highlighted >= self.config.min_highlighted then
juice_flip(card)
for i = 1, #G.hand.highlighted do
G.hand.highlighted[i]:set_ability(G.P_CENTERS.m_glass, nil, true)
end
juice_flip(card, true)
for i = 1, #G.hand.highlighted do
if SMODS.pseudorandom_probability(card, 'icestone', self.config.num, self.config.dem, 'icestone') then
poke_remove_card(G.hand.highlighted[i], card)
end
end
poke_unhighlight_cards()
evo_item_use_total(self, card, area, copier)
else
highlighted_evo_item(self, card, area, copier)
end
end,
in_pool = function(self)
return true
end
}
local linkcable = {
name = "linkcable",
key = "linkcable",
set = "Item",
config = {max_highlighted = 2, min_highlighted = 2},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
return {vars = {self.config.max_highlighted}}
end,
pos = { x = 6, y = 4 },
atlas = "AtlasConsumablesBasic",
cost = 4,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.jokers.highlighted and #G.jokers.highlighted == 1 and is_evo_item_for(self, G.jokers.highlighted[1]) then
return true
end
if G.hand.highlighted and #G.hand.highlighted == 2 then
return true
end
return false
end,
use = function(self, card, area, copier)
set_spoon_item(card)
if G.hand.highlighted and #G.hand.highlighted == 2 then
local rightmost = G.hand.highlighted[1]
for i=1, #G.hand.highlighted do if G.hand.highlighted[i].T.x > rightmost.T.x then rightmost = G.hand.highlighted[i] end end
juice_flip(card)
for i=1, #G.hand.highlighted do
if G.hand.highlighted[i] ~= rightmost then
poke_vary_rank(G.hand.highlighted[i], false)
else
poke_vary_rank(G.hand.highlighted[i], true)
end
end
juice_flip(card, true)
delay(0.5)
poke_unhighlight_cards()
evo_item_use_total(self, card, area, copier)
else
highlighted_evo_item(self, card, area, copier)
end
end,
in_pool = function(self)
return true
end
}
local metalcoat = {
name = "metalcoat",
key = "metalcoat",
set = "Item",
config = {max_highlighted = 1},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'typechanger', vars = {"Metal", colours = {G.ARGS.LOC_COLOURS.metal}}}
return {vars = {self.config.max_highlighted}}
end,
pos = { x = 6, y = 2 },
atlas = "AtlasConsumablesBasic",
cost = 4,
unlocked = true,
discovered = true,
use = function(self, card, area, copier)
set_spoon_item(card)
local choice = nil
if G.jokers.highlighted and #G.jokers.highlighted == 1 then
choice = G.jokers.highlighted[1]
elseif G.jokers and G.jokers.cards and #G.jokers.cards > 0 then
choice = G.jokers.cards[1]
end
if choice then
apply_type_sticker(choice, "Metal")
card_eval_status_text(choice, 'extra', nil, nil, nil, {message = localize("poke_metal_ex"), colour = G.ARGS.LOC_COLOURS["metal"]})
end
local copy = copy_card(G.hand.highlighted[1], nil, nil, G.playing_card)
copy:set_ability(G.P_CENTERS.m_steel, nil, true)
poke_add_card(copy, card)
poke_unhighlight_cards()
end,
in_pool = function(self)
return true
end
}
local dragonscale = {
name = "dragonscale",
key = "dragonscale",
set = "Item",
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'typechanger', vars = {"Dragon", colours = {G.ARGS.LOC_COLOURS.dragon}}}
end,
pos = { x = 7, y = 2 },
atlas = "AtlasConsumablesBasic",
cost = 4,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
return #G.jokers.cards > 0
end,
use = function(self, card, area, copier)
set_spoon_item(card)
local choice = nil
if G.jokers.highlighted and #G.jokers.highlighted == 1 then
choice = G.jokers.highlighted[1]
else
choice = G.jokers.cards[1]
end
apply_type_sticker(choice, "Dragon")
card_eval_status_text(choice, 'extra', nil, nil, nil, {localize("poke_dragon_ex"), colour = G.ARGS.LOC_COLOURS["dragon"]})
for i = 1, 3 do
if #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then
local card_type = nil
if pseudorandom(pseudoseed('dragonscale')) > .50 or G.GAME.modifiers.no_energy then
card_type = "Item"
else
card_type = "Energy"
end
local _card = create_card(card_type, G.consumeables, nil, nil, nil, nil, nil)
_card:add_to_deck()
G.consumeables:emplace(_card)
end
end
end,
in_pool = function(self)
return true
end
}
local kingsrock = {
name = "kingsrock",
key = "kingsrock",
set = "Item",
config = {max_highlighted = 1},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
return {vars = {self.config.max_highlighted}}
end,
pos = { x = 5, y = 2 },
atlas = "AtlasConsumablesBasic",
cost = 4,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.jokers.highlighted and #G.jokers.highlighted == 1 and is_evo_item_for(self, G.jokers.highlighted[1]) then
return true
end
if G.hand.highlighted and #G.hand.highlighted == 1 then
return true
end
return false
end,
use = function(self, card, area, copier)
set_spoon_item(card)
if G.hand.highlighted and #G.hand.highlighted == 1 then
local conv_card = G.hand.highlighted[1]
juice_flip(card)
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.2,
func = function()
SMODS.change_base(conv_card, nil, "King")
return true
end
}))
delay(0.5)
juice_flip(card, true)
poke_unhighlight_cards()
evo_item_use_total(self, card, area, copier)
else
highlighted_evo_item(self, card, area, copier)
end
end,
in_pool = function(self)
return true
end
}
local upgrade = {
name = "upgrade",
key = "upgrade",
set = "Item",
config = {max_highlighted = 2, min_highlighted = 1,},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
return {vars = {self.config.max_highlighted}}
end,
pos = { x = 8, y = 2 },
atlas = "AtlasConsumablesBasic",
cost = 4,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.jokers.highlighted and #G.jokers.highlighted == 1 and is_evo_item_for(self, G.jokers.highlighted[1]) then
return true
end
if G.hand.highlighted and #G.hand.highlighted >= self.config.min_highlighted and #G.hand.highlighted <= self.config.max_highlighted then
return true
end
return false
end,
use = function(self, card, area, copier)
set_spoon_item(card)
if #G.hand.highlighted >= self.config.min_highlighted then
local enhancement = SMODS.poll_enhancement({options = {"m_bonus", "m_mult", "m_wild", "m_glass", "m_steel", "m_gold", "m_lucky"}, guaranteed = true})
juice_flip(card)
for i = 1, #G.hand.highlighted do
G.hand.highlighted[i]:set_ability(G.P_CENTERS[enhancement], nil, true)
end
juice_flip(card, true)
poke_unhighlight_cards()
evo_item_use_total(self, card, area, copier)
else
highlighted_evo_item(self, card, area, copier)
end
end,
in_pool = function(self)
return not next(find_joker("porygon2"))
end
}
local hardstone = {
name = "hardstone",
key = "hardstone",
set = "Item",
artist = "Sonfive",
config = {max_highlighted = 1, max_chips = 10},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = G.P_CENTERS.m_stone
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
return {vars = {self.config.max_highlighted, self.config.max_chips}}
end,
pos = { x = 5, y = 5 },
atlas = "AtlasConsumablesBasic",
cost = 4,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.jokers.highlighted and #G.jokers.highlighted == 1 and is_evo_item_for(self, G.jokers.highlighted[1]) then
return true
end
if G.hand.highlighted and #G.hand.highlighted == 1 then
return true
end
return false
end,
use = function(self, card, area, copier)
set_spoon_item(card)
if G.hand.highlighted and #G.hand.highlighted == 1 then
local conv_card = G.hand.highlighted[1]
juice_flip(card)
conv_card:set_ability(G.P_CENTERS.m_stone, nil, true)
local bonus = self.config.max_chips * #find_pokemon_type("Earth")
if bonus > 0 then
conv_card.ability.perma_bonus = conv_card.ability.perma_bonus or 0
conv_card.ability.perma_bonus = conv_card.ability.perma_bonus + bonus
end
juice_flip(card, true)
delay(0.5)
poke_unhighlight_cards()
evo_item_use_total(self, card, area, copier)
else
highlighted_evo_item(self, card, area, copier)
end
end,
in_pool = function(self)
return true
end
}
local miracleseed = {
name = "miracleseed",
key = "miracleseed",
set = "Item",
config = {max_highlighted = 1, min_highlighted = 1},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = G.P_CENTERS.m_poke_seed
return {vars = {self.config.max_highlighted}}
end,
pos = { x = 2, y = 7 },
atlas = "AtlasConsumablesBasic",
artist = {"Emma", "Catzzadilla"},
cost = 4,
unlocked = true,
discovered = true,
use = function(self, card, area, copier)
set_spoon_item(card)
juice_flip(card)
for i = 1, #G.hand.highlighted do
G.hand.highlighted[i]:set_ability(G.P_CENTERS.m_poke_seed, nil, true)
end
juice_flip(card, true)
poke_unhighlight_cards()
end,
in_pool = function(self)
return true
end
}
local prismscale = {
name = "prismscale",
key = "prismscale",
set = "Item",
config = {max_highlighted = 1, converted = 4},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
return {vars = {self.config.max_highlighted, self.config.converted}}
end,
pos = { x = 3, y = 5 },
atlas = "AtlasConsumablesBasic",
cost = 4,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.jokers.highlighted and #G.jokers.highlighted == 1 and is_evo_item_for(self, G.jokers.highlighted[1]) then
return true
end
if G.hand.highlighted and #G.hand.highlighted == 1 then
return true
end
return false
end,
use = function(self, card, area, copier)
set_spoon_item(card)
if #G.hand.highlighted == 1 then
local selected_suit = G.hand.highlighted[1].base.suit
local cards_held = {}
for k, v in ipairs(G.hand.cards) do
if v ~= G.hand.highlighted[1] then
table.insert(cards_held, v)
end
end
pseudoshuffle(cards_held, pseudoseed('prism'))
local limit = math.min(#cards_held, self.config.converted)
juice_flip_table(card, cards_held, false, limit)
for i = 1, limit do
G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function() cards_held[i]:change_suit(selected_suit);return true end }))
end
juice_flip_table(card, cards_held, true, limit)
poke_unhighlight_cards()
evo_item_use_total(self, card, area, copier)
else
highlighted_evo_item(self, card, area, copier)
end
end,
in_pool = function(self)
return true
end
}
local list = {twisted_spoon, firestone, waterstone, thunderstone, leafstone, moonstone, sunstone, shinystone, duskstone, dawnstone, icestone,
linkcable, metalcoat, dragonscale, kingsrock, upgrade, hardstone, miracleseed, prismscale}
return {name = "AtlasConsumablesBasic 3",
list = list
}
================================================
FILE: consumables/04_mart_rare.lua
================================================
local leftovers = {
name = "leftovers",
key = "leftovers",
set = "Item",
helditem = true,
config = {extra = {joker_highlighted = 1, money_mod = 2, usable = true}},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'endless'}
return {vars = {self.config.extra.joker_highlighted, self.config.extra.money_mod}}
end,
pos = { x = 7, y = 4 },
soul_pos = { x = 6, y = 5 },
atlas = "AtlasConsumablesBasic",
cost = 3,
unlocked = true,
discovered = true,
hidden = true,
soul_set = "Item",
soul_rate = .025,
can_use = function(self, card)
if G.STATE == G.STATES.SMODS_BOOSTER_OPENED or G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.PLANET_PACK
or G.STATE == G.STATES.STANDARD_PACK then
if (#G.consumeables.cards + G.GAME.consumeable_buffer >= G.consumeables.config.card_limit) and card.area == G.pack_cards then return false end
end
if card.area == G.shop_jokers then return false end
if not (G.jokers and G.jokers.cards) then return false end
if #G.jokers.cards == 0 then return false end
return card.ability.extra.usable
end,
use = function(self, card, area, copier)
local target = nil
if not G.jokers.highlighted or #G.jokers.highlighted ~= 1 then
target = G.jokers.cards[1]
else
target = G.jokers.highlighted[1]
end
target.ability.extra_value = target.ability.extra_value + card.ability.extra.money_mod
target:set_cost()
G.E_MANAGER:add_event(Event({
func = function() card_eval_status_text(target, 'extra', nil, nil, nil, {message = localize('k_val_up')}); return true
end}))
card.ability.extra.usable = false
card.children.floating_sprite:set_sprite_pos({ x = 99, y = 99 })
end,
calculate = function(self, card, context)
if context.end_of_round and not card.ability.extra.usable then
card.ability.extra.usable = true
card_eval_status_text(card, 'extra', nil, nil, nil, {message = localize('k_reset')})
card.children.floating_sprite:set_sprite_pos({ x = 6, y = 5 })
end
end,
set_sprites = function(self, card, front)
if card.no_load_reusable_sprite then
card.children.floating_sprite:set_sprite_pos({ x = 99, y = 99 })
card.no_load_reusable_sprite = nil
end
end,
load = function(self, card, card_table, other_card)
if not card_table.ability.extra.usable then
card.no_load_reusable_sprite = true
end
end,
keep_on_use = function(self, card)
return true
end,
in_pool = function(self)
return true
end
}
local heavyboots = {
name = "heavyboots",
key = "heavyboots",
set = "Item",
helditem = true,
config = {extra = {usable = true, hazard_off = false}},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'endless'}
return {vars = {}}
end,
pos = { x = 3, y = 7 },
soul_pos = { x = 4, y = 7 },
atlas = "AtlasConsumablesBasic",
artist = {{name = "Emma", layer = "soul"}, {name = "Catzzadilla", layer = "center"}},
cost = 4,
unlocked = true,
discovered = true,
hidden = true,
soul_set = "Item",
soul_rate = .01,
can_use = function(self, card)
if G.STATE == G.STATES.SMODS_BOOSTER_OPENED or G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.PLANET_PACK
or G.STATE == G.STATES.STANDARD_PACK then
if (#G.consumeables.cards + G.GAME.consumeable_buffer >= G.consumeables.config.card_limit) and card.area == G.pack_cards then return false end
end
return card.ability.extra.usable
end,
use = function(self, card, area, copier)
card.ability.extra.usable = false
card.ability.extra.hazard_off = true
card.children.floating_sprite:set_sprite_pos({ x = 99, y = 99 })
end,
calculate = function(self, card, context)
if context.fix_probability and card.ability.extra.hazard_off and context.identifier == 'hazard' then
return {
numerator = 0,
}
end
if context.end_of_round and not card.ability.extra.usable then
card.ability.extra.usable = true
card_eval_status_text(card, 'extra', nil, nil, nil, {message = localize('k_reset')})
card.children.floating_sprite:set_sprite_pos({ x = 4, y = 7 })
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.1,
func = function()
card.ability.extra.hazard_off = false
return true
end
}))
end
end,
set_sprites = function(self, card, front)
if card.no_load_reusable_sprite then
card.children.floating_sprite:set_sprite_pos({ x = 99, y = 99 })
card.no_load_reusable_sprite = nil
end
end,
load = function(self, card, card_table, other_card)
if not card_table.ability.extra.usable then
card.no_load_reusable_sprite = true
end
end,
keep_on_use = function(self, card)
return true
end,
in_pool = function(self)
return G.GAME.round_resets.hazard_level and G.GAME.round_resets.hazard_level > 0
end,
}
local teraorb = {
name = "teraorb",
key = "teraorb",
set = "Item",
config = {extra = {change_to_type = "Grass"}},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'energize'}
local info = center.ability.extra or self.config.extra
info_queue[#info_queue+1] = {set = 'Other', key = 'typechanger', vars = {info.change_to_type, colours = {G.ARGS.LOC_COLOURS[string.lower(info.change_to_type)]}}}
local highlight_colour = info.change_to_type ~= "Lightning" and G.C.WHITE or G.C.BLACK
return {vars = {info.change_to_type, colours = {G.ARGS.LOC_COLOURS[string.lower(info.change_to_type)], highlight_colour}}}
end,
pos = { x = 2, y = 9 },
soul_pos = { x = 3, y = 9 },
atlas = "AtlasConsumablesBasic",
cost = 3,
soul_set = "Item",
soul_rate = .045,
unlocked = true,
discovered = true,
can_use = function(self, card)
return #G.jokers.cards > 0
end,
use = function(self, card, area, copier)
set_spoon_item(card)
local choice = poke_find_leftmost_or_highlighted()
if is_type(choice, card.ability.extra.change_to_type) then
energy_increase(choice, get_type(choice))
end
apply_type_sticker(choice, card.ability.extra.change_to_type)
card_eval_status_text(choice, 'extra', nil, nil, nil, {message = localize("poke_tera_ex"), colour = G.C.SECONDARY_SET.Spectral})
end,
calculate = function(self, card, context)
if context.cardarea == G.jokers and context.scoring_hand then
if context.joker_main then
local poketype_list = {"Grass", "Fire", "Water", "Lightning", "Psychic", "Fighting", "Colorless", "Dark", "Metal", "Fairy", "Dragon", "Earth"}
local change_list = {}
for i = 1, #poketype_list do
if card.ability.extra.change_to_type ~= poketype_list[i] then
change_list[#change_list + 1] = poketype_list[i]
end
end
card.ability.extra.change_to_type = pseudorandom_element(change_list, 'tera')
G.E_MANAGER:add_event(Event({
func = function()
self:set_sprites(card)
return true
end
}))
card_eval_status_text(card, 'extra', nil, nil, nil, {message = card.ability.extra.change_to_type, colour = G.ARGS.LOC_COLOURS[string.lower(card.ability.extra.change_to_type)]})
end
end
end,
set_ability = function(self, card, initial, delay_sprites)
if initial then
local poketype_list = {"Grass", "Fire", "Water", "Lightning", "Psychic", "Fighting", "Colorless", "Dark", "Metal", "Fairy", "Dragon", "Earth"}
card.ability.extra.change_to_type = pseudorandom_element(poketype_list, 'tera')
self:set_sprites(card)
end
end,
set_sprites = function(self, card, front)
local info = card.ability and card.ability.extra or self.config.extra
local sprite_locations = {grass = {x = 2, y = 9}, fire = {x = 0, y = 9}, water = {x = 2, y = 10}, lightning = {x = 4, y = 9}, psychic = {x = 8, y = 9}, fighting = {x = 8, y = 8},
colorless = {x = 0, y = 10}, dark = {x = 0, y = 8}, metal = {x = 6, y = 9}, fairy = {x = 6, y = 8}, dragon = {x = 2, y = 8}, earth = {x = 4, y = 8}}
local sprite_x = sprite_locations[string.lower(info.change_to_type)].x
local sprite_y = sprite_locations[string.lower(info.change_to_type)].y
card.children.center:set_sprite_pos({x = sprite_x, y = sprite_y})
card.children.floating_sprite:set_sprite_pos({x = sprite_x + 1, y = sprite_y})
end,
in_pool = function(self)
return true
end
}
local thickclub = {
name = "thickclub",
key = "thickclub",
set = "Item",
helditem = true,
config = {max_highlighted = 1, bonus = 10, extra = {usable = true}},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'endless'}
return {vars = {self.config.max_highlighted, self.config.bonus}}
end,
pos = { x = 9, y = 4 },
soul_pos = { x = 8, y = 5 },
atlas = "AtlasConsumablesBasic",
cost = 3,
unlocked = true,
discovered = true,
hidden = true,
soul_set = "Item",
soul_rate = .025,
can_use = function(self, card)
if card.area == G.shop_jokers then return false end
if G.hand.highlighted and #G.hand.highlighted ~= 1 then return false end
if G.STATE == G.STATES.SMODS_BOOSTER_OPENED or G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.PLANET_PACK
or G.STATE == G.STATES.STANDARD_PACK then
if (#G.consumeables.cards + G.GAME.consumeable_buffer >= G.consumeables.config.card_limit) and card.area == G.pack_cards then return false end
end
return card.ability.extra.usable
end,
use = function(self, card, area, copier)
local conv_card = G.hand.highlighted[1]
local current_bonus = conv_card.ability.perma_bonus or 0
juice_flip(card)
conv_card.ability.perma_bonus = current_bonus + self.config.bonus
juice_flip(card, true)
delay(0.5)
poke_unhighlight_cards()
card.ability.extra.usable = false
card.children.floating_sprite:set_sprite_pos({ x = 99, y = 99 })
end,
calculate = function(self, card, context)
if context.end_of_round and not card.ability.extra.usable then
card.ability.extra.usable = true
card_eval_status_text(card, 'extra', nil, nil, nil, {message = localize('k_reset')})
card.children.floating_sprite:set_sprite_pos({ x = 8, y = 5 })
end
end,
set_sprites = function(self, card, front)
if card.no_load_reusable_sprite then
card.children.floating_sprite:set_sprite_pos({ x = 99, y = 99 })
card.no_load_reusable_sprite = nil
end
end,
load = function(self, card, card_table, other_card)
if not card_table.ability.extra.usable then
card.no_load_reusable_sprite = true
end
end,
keep_on_use = function(self, card)
return true
end,
in_pool = function(self)
return true
end
}
local list = {leftovers, heavyboots, teraorb, thickclub}
return {name = "AtlasConsumablesBasic 4",
list = list
}
================================================
FILE: consumables/05_mart_specific.lua
================================================
local leek = {
name = "leek",
key = "leek",
set = "Item",
helditem = true,
config = {extra = {num = 1, dem = 2, usable = true}},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'endless'}
local card = center or self
if not card.edition or (card.edition and not card.edition.foil) then
info_queue[#info_queue+1] = G.P_CENTERS.e_foil
end
if not card.edition or (card.edition and not card.edition.holo) then
info_queue[#info_queue+1] = G.P_CENTERS.e_holo
end
if not card.edition or (card.edition and not card.edition.polychrome) then
info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome
end
local num, dem = SMODS.get_probability_vars(center, card.ability.extra.num, card.ability.extra.dem, 'leek')
return {vars = {num, dem}}
end,
pos = { x = 8, y = 4 },
soul_pos = { x = 7, y = 5 },
atlas = "AtlasConsumablesBasic",
cost = 3,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.STATE == G.STATES.SMODS_BOOSTER_OPENED or G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.PLANET_PACK
or G.STATE == G.STATES.STANDARD_PACK then
if (#G.consumeables.cards + G.GAME.consumeable_buffer >= G.consumeables.config.card_limit) and card.area == G.pack_cards then return false end
end
if card.area == G.shop_jokers then return false end
return card.ability.extra.usable
end,
use = function(self, card, area, copier)
local removed = nil
if SMODS.pseudorandom_probability(card, 'leek', card.ability.extra.num, card.ability.extra.dem, 'leek') then
local edition = poll_edition('wheel_of_fortune', nil, true, true)
card:set_edition(edition, true)
else
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function()
attention_text({
text = localize('k_nope_ex'),
scale = 1.3,
hold = 1.4,
major = card,
backdrop_colour = G.C.SECONDARY_SET.Tarot,
align = (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK) and 'tm' or 'cm',
offset = {x = 0, y = (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK) and -0.2 or 0},
silent = true
})
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, func = function()
play_sound('tarot2', 0.76, 0.4);return true end}))
play_sound('tarot2', 1, 0.4)
card:juice_up(0.3, 0.5)
return true end }))
end
card.ability.extra.usable = false
card.children.floating_sprite:set_sprite_pos({ x = 99, y = 99 })
end,
calculate = function(self, card, context)
if context.end_of_round and card.edition then
card:set_edition(nil, true)
end
if context.end_of_round and not card.ability.extra.usable then
card.ability.extra.usable = true
card_eval_status_text(card, 'extra', nil, nil, nil, {message = localize('k_reset')})
card.children.floating_sprite:set_sprite_pos({ x = 7, y = 5 })
end
end,
set_sprites = function(self, card, front)
if card.no_load_reusable_sprite then
card.children.floating_sprite:set_sprite_pos({ x = 99, y = 99 })
card.no_load_reusable_sprite = nil
end
end,
load = function(self, card, card_table, other_card)
if not card_table.ability.extra.usable then
card.no_load_reusable_sprite = true
end
end,
keep_on_use = function(self, card)
return true
end,
in_pool = function(self)
return false
end
}
local dubious_disc = {
name = "dubious_disc",
key = "dubious_disc",
set = "Item",
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'eitem'}
end,
pos = { x = 0, y = 5 },
atlas = "AtlasConsumablesBasic",
cost = 4,
evo_item = true,
unlocked = true,
discovered = true,
can_use = function(self, card)
if G.jokers.highlighted and #G.jokers.highlighted == 1 and is_evo_item_for(self, G.jokers.highlighted[1]) then
return true
end
return G.hand.cards and #G.hand.cards > 0
end,
use = function(self, card, area, copier)
set_spoon_item(card)
if G.hand.cards and #G.hand.cards > 0 then
juice_flip_hand(card)
for i = 1, #G.hand.cards do
local enhancement = SMODS.poll_enhancement({guaranteed = true})
G.hand.cards[i]:set_ability(enhancement, nil, true)
end
juice_flip_hand(card, true)
evo_item_use_total(self, card, area, copier)
else
highlighted_evo_item(self, card, area, copier)
end
end,
in_pool = function(self)
return next(find_joker("porygon2"))
end
}
local heartscale = {
name = "heartscale",
key = "heartscale",
set = "Item",
config = {max_highlighted = 2, min_highlighted = 2, suit = "Hearts"},
loc_vars = function(self, info_queue, center)
return {vars = {self.config.max_highlighted, localize(self.config.suit, 'suits_plural')}}
end,
pos = { x = 9, y = 5 },
atlas = "AtlasConsumablesBasic",
artist = "MyDude_YT",
cost = 2,
unlocked = true,
discovered = true,
use = function(self, card, area, copier)
set_spoon_item(card)
juice_flip(card)
local rightmost = G.hand.highlighted[1]
for i = 1, #G.hand.highlighted do
if G.hand.highlighted[i].T.x > rightmost.T.x then
rightmost = G.hand.highlighted[i]
end
end
for i = 1, #G.hand.highlighted do
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.1,
func = function()
if G.hand.highlighted[i] ~= rightmost then
copy_card(rightmost, G.hand.highlighted[i])
end
return true
end
}))
end
for i = 1, #G.hand.highlighted do
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.1,
func = function()
G.hand.highlighted[i]:change_suit(self.config.suit)
return true
end
}))
end
juice_flip(card, true)
delay(0.5)
poke_unhighlight_cards()
end,
in_pool = function(self)
return false
end
}
local meteorite = {
name = "meteorite",
key = "meteorite",
set = "Spectral",
saveable = true,
helditem = true,
artist = {name = {"Currently a placeholder!", "Want your art here?", "Join the Discord!"}},
config = {extra = {destroy = 1, forme = "Normal", usable = true}},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'endless'}
return {vars = {localize('poke_'..string.lower(center.ability.extra.forme)..'_forme')}}
end,
pos = { x = 5, y = 7 },
soul_pos = { x = 6, y = 7 },
atlas = "AtlasConsumablesBasic",
cost = 3,
unlocked = true,
discovered = true,
hidden = true,
soul_set = "Planet",
soul_rate = .2,
no_collection = true,
use = function(self, card, area, copier)
card.ability.extra.usable = false
card.children.floating_sprite:set_sprite_pos({ x = 99, y = 99 })
local destroyed_cards = {}
local temp_deck = {}
for _, playing_card in ipairs(G.deck.cards) do temp_deck[#temp_deck + 1] = playing_card end
table.sort(temp_deck,
function(a, b)
return not a.playing_card or not b.playing_card or a.playing_card < b.playing_card
end
)
pseudoshuffle(temp_deck, 'meteor')
for i = 1, card.ability.extra.destroy do destroyed_cards[#destroyed_cards + 1] = temp_deck[i] end
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.4,
func = function()
play_sound('tarot1')
card:juice_up(0.3, 0.5)
return true
end
}))
SMODS.destroy_cards(destroyed_cards)
local deoxys = poke_find_card("j_poke_deoxys", true)
if not deoxys then
deoxys = poke_find_card("j_poke_deoxys")
end
if deoxys then
local forme_list = {"Attack", "Defense", "Speed", "Normal"}
local curr_index = 0
for i = 1, #forme_list do
if forme_list[i] == card.ability.extra.forme then
curr_index = i
break
end
end
if deoxys.ability.extra.form ~= curr_index then
deoxys.ability.extra.form = curr_index
poke_fake_evolve(deoxys, localize("poke_transform_success"), true)
end
end
end,
calculate = function(self, card, context)
if context.reroll_shop then
local forme_list = {"Attack", "Defense", "Speed", "Normal"}
local next_index = 0
for i = 1, #forme_list do
if forme_list[i] == card.ability.extra.forme then
next_index = i + 1
if next_index > #forme_list then next_index = 1 end
break
end
end
card.ability.extra.forme = forme_list[next_index]
card_eval_status_text(card, 'extra', nil, nil, nil, {message = localize('poke_'..string.lower(card.ability.extra.forme)..'_forme')})
end
if context.end_of_round and not card.ability.extra.usable then
card.ability.extra.usable = true
card_eval_status_text(card, 'extra', nil, nil, nil, {message = localize('k_reset')})
card.children.floating_sprite:set_sprite_pos({ x = 6, y = 7 })
end
end,
can_use = function(self, card)
if G.STATE == G.STATES.SMODS_BOOSTER_OPENED or G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.PLANET_PACK
or G.STATE == G.STATES.STANDARD_PACK then
if (#G.consumeables.cards + G.GAME.consumeable_buffer >= G.consumeables.config.card_limit) and card.area == G.pack_cards then return false end
end
return G.deck and #G.deck.cards > 0 and card.ability.extra.usable
end,
set_sprites = function(self, card, front)
if card.no_load_reusable_sprite then
card.children.floating_sprite:set_sprite_pos({ x = 99, y = 99 })
card.no_load_reusable_sprite = nil
end
end,
load = function(self, card, card_table, other_card)
if not card_table.ability.extra.usable then
card.no_load_reusable_sprite = true
end
end,
in_pool = function(self)
return next(SMODS.find_card('j_poke_deoxys'))
end,
keep_on_use = function(self, card)
return true
end,
}
local list = {leek, dubious_disc, heartscale, meteorite}
return {name = "AtlasConsumablesBasic 5",
list = list
}
================================================
FILE: consumables/06_mart_berry.lua
================================================
pokermon.juice_list = {Energy = "c_poke_berry_juice_energy", Spectral = "c_poke_berry_juice_spectral", Planet = "c_poke_berry_juice_planet", Item = "c_poke_berry_juice_item",
Tarot = "c_poke_berry_juice_tarot"}
local berry_juice = {
name = "berry_juice",
key = "berry_juice",
set = "Item",
artist = "Sonfive",
loc_vars = function(self, info_queue, center)
end,
berry_juice = true,
poke_multi_item = true,
pos = { x = 1, y = 6 },
atlas = "AtlasConsumablesBasic",
cost = 12,
poke_always_unlocked = true,
unlocked = true,
discovered = true,
in_pool = function(self)
return false
end
}
local berry_juice_energy = {
name = "berry_juice_energy",
key = "berry_juice_energy",
set = "Item",
artist = "Sonfive",
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = {set = 'Other', key = 'energize'}
return {vars = {(pokermon_config.unlimited_energy and localize("poke_unlimited_energy")) or energy_max + (G.GAME.energy_plus or 0)}}
end,
berry_juice = true,
poke_multi_item = true,
pos = { x = 6, y = 6 },
atlas = "AtlasConsumablesBasic",
cost = 12,
unlocked = true,
discovered = true,
no_collection = true,
in_pool = function(self)
return false
end,
can_use = function(self, card)
local choice = nil
if G.jokers.highlighted and #G.jokers.highlighted == 1 then
choice = G.jokers.highlighted[1]
elseif G.jokers.cards and #G.jokers.cards > 0 then
choice = G.jokers.cards[1]
else
return false
end
if choice.ability and choice.ability.extra and type(choice.ability.extra) == "table" and choice.ability.extra.ptype then
return true
else
return false
end
end,
use = function(self, card, area, copier)
local choice = nil
if G.jokers.highlighted and #G.jokers.highlighted == 1 then
choice = G.jokers.highlighted[1]
else
choice = G.jokers.cards[1]
end
play_sound('poke_energy_use', 1, 0.5)
if choice.config and choice.config.center.stage and not type_sticker_applied(choice) then
energy_increase(choice, choice.ability.extra.ptype)
elseif type_sticker_applied(choice) then
energy_increase(choice, type_sticker_applied(choice))
end
if not G.GAME.modifiers.no_interest then
G.GAME.modifiers.reset_no_interest = true
G.GAME.modifiers.no_interest = true
end
end
}
local berry_juice_spectral = {
name = "berry_juice_spectral",
key = "berry_juice_spectral",
set = "Item",
artist = "Sonfive",
config = {max_highlighted = 1},
loc_vars = function(self, info_queue, center)
info_queue[#info_queue+1] = G.P_CENTERS.e_foil
info_queue[#info_queue+1] = G.P_CENTERS.e_holo
info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome
return {vars = {self.config.max_highlighted}}
end,
berry_juice = true,
poke_multi_item = true,
pos = { x = 4, y = 6 },
atlas = "AtlasConsumablesBasic",
cost = 12,
unlocked = true,
discovered = true,
no_collection = true,
in_pool = function(self)
return false
end,
use = function(self, card, area, copier)
local target = G.hand.highlighted[1]
local args = {edition = poll_edition('aura', nil, true, true), seal = SMODS.poll_seal({guaranteed = true})}
poke_convert_cards_to(target, args, nil, true)
end
}
local berry_juice_planet = {
name = "berry_juice_planet",
key = "berry_juice_planet",
set = "Item",
artist = "Sonfive",
loc_vars = function(self, info_queue, center)
end,
berry_juice = true,
poke_multi_item = true,
pos = { x = 3, y = 6 },
atlas = "AtlasConsumablesBasic",
cost = 12,
unlocked = true,
discovered = true,
no_collection = true,
in_pool = function(self)
return false
end,
can_use = function(self, card)
return true
end,
use = function(self, card, area, copier)
local temp_hands = {}
local sort_function = function(hand1, hand2) return hand1.level > hand2.level end
for k, v in pairs(G.GAME.hands) do
if v.visible then
local hand = v
hand.handname = k
table.insert(temp_hands, hand)
end
end
table.sort(temp_hands, sort_function)
local upgrade_handname = temp_hands[1].handname
SMODS.smart_level_up_hand(card, upgrade_handname)
end
}
local be
gitextract_9tj2e7bi/
├── .gitignore
├── LICENSE
├── Pokermon.json
├── README.md
├── assets/
│ ├── shaders/
│ │ ├── booster.fs
│ │ ├── evolution.fs
│ │ ├── shiny.fs
│ │ └── zorua.fs
│ └── sounds/
│ ├── chomp.ogg
│ ├── e_shiny.ogg
│ ├── energy_use.ogg
│ ├── ludicolo.ogg
│ ├── miror_b_music.ogg
│ ├── pocket_music_high.ogg
│ ├── pocket_music_high_knockoff.ogg
│ ├── pocket_music_low.ogg
│ ├── seed_1.ogg
│ ├── seed_2.ogg
│ ├── seed_3.ogg
│ ├── seed_4.ogg
│ ├── seed_5.ogg
│ └── voltorb_flip_music.ogg
├── backs/
│ └── backs1.lua
├── blinds/
│ └── pokebossblind.lua
├── boosters/
│ └── packs1.lua
├── challenges/
│ └── pokechallenges.lua
├── config.lua
├── consumable types/
│ └── type1.lua
├── consumables/
│ ├── 00_mart_balls.lua
│ ├── 01_mart_energy.lua
│ ├── 02_mart_spectral.lua
│ ├── 03_mart_items.lua
│ ├── 04_mart_rare.lua
│ ├── 05_mart_specific.lua
│ ├── 06_mart_berry.lua
│ ├── 07_mart_jirachi.lua
│ └── 08_mart_machine.lua
├── editions/
│ └── editions1.lua
├── enhancements/
│ └── enhancement1.lua
├── functions/
│ ├── apifunctions.lua
│ ├── debufffunctions.lua
│ ├── dex_order.lua
│ ├── displaycard.lua
│ ├── energizable_vanilla.lua
│ ├── energyfunctions.lua
│ ├── inputmanager.lua
│ ├── jokerdisplayfunctions.lua
│ ├── pokecompat.lua
│ ├── pokeconstants.lua
│ ├── pokedraw.lua
│ ├── pokefamily.lua
│ ├── pokefunctions.lua
│ ├── pokespriteload.lua
│ ├── pokeutils.lua
│ └── uifunctions.lua
├── jokerdisplay/
│ ├── definitions1.lua
│ ├── definitions2.lua
│ ├── definitions3.lua
│ ├── definitions4.lua
│ ├── definitions5.lua
│ ├── definitions6.lua
│ ├── definitions7.lua
│ ├── definitions8.lua
│ ├── definitions9.lua
│ └── definitionsOther.lua
├── localization/
│ ├── de.lua
│ ├── en-us.lua
│ ├── es_419.lua
│ ├── es_ES.lua
│ ├── fr.lua
│ ├── id.lua
│ ├── it.lua
│ ├── ja.lua
│ ├── ko.lua
│ ├── nl.lua
│ ├── pl.lua
│ ├── pt_BR.lua
│ ├── ru.lua
│ ├── vi.lua
│ ├── zh_CN.lua
│ └── zh_TW.lua
├── lovely/
│ ├── UI.toml
│ ├── controller_support.toml
│ ├── daily_challenge.toml
│ ├── draw_card.toml
│ ├── gameplay_functions.toml
│ ├── poke_utils.toml
│ └── start_up.toml
├── pokemon/
│ ├── pokejokers_01.lua
│ ├── pokejokers_02.lua
│ ├── pokejokers_03.lua
│ ├── pokejokers_04.lua
│ ├── pokejokers_05.lua
│ ├── pokejokers_06.lua
│ ├── pokejokers_07.lua
│ ├── pokejokers_08.lua
│ ├── pokejokers_09.lua
│ ├── pokejokers_10.lua
│ ├── pokejokers_11.lua
│ ├── pokejokers_12.lua
│ ├── pokejokers_13.lua
│ ├── pokejokers_14.lua
│ ├── pokejokers_15.lua
│ ├── pokejokers_16.lua
│ ├── pokejokers_17.lua
│ ├── pokejokers_18.lua
│ ├── pokejokers_19.lua
│ ├── pokejokers_20.lua
│ ├── pokejokers_21.lua
│ ├── pokejokers_22.lua
│ ├── pokejokers_23.lua
│ ├── pokejokers_24.lua
│ ├── pokejokers_25.lua
│ ├── pokejokers_26.lua
│ ├── pokejokers_27.lua
│ ├── pokejokers_28.lua
│ ├── pokejokers_29.lua
│ ├── pokejokers_30.lua
│ ├── pokejokers_31.lua
│ ├── pokejokers_32.lua
│ ├── pokejokers_33.lua
│ ├── pokejokers_34.lua
│ ├── pokejokers_35.lua
│ ├── zmissingno.lua
│ ├── zotherjokers.lua
│ └── zzzapril_fools.lua
├── pokequips.lua
├── pokermon.lua
├── pokesprites.lua
├── pokeui.lua
├── seals/
│ └── seals1.lua
├── setup.lua
├── sleeves/
│ └── sleeve.lua
├── stickers/
│ └── stickers.lua
├── tags/
│ └── tags1.lua
└── vouchers/
└── pokevouchers.lua
Condensed preview — 136 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,798K chars).
[
{
"path": ".gitignore",
"chars": 22,
"preview": ".vscode/\n\nsync.ffs_db\n"
},
{
"path": "LICENSE",
"chars": 35149,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "Pokermon.json",
"chars": 523,
"preview": "{\n\t\"id\": \"Pokermon\",\n\t\"name\": \"Pokermon\",\n\t\"author\": [\"InertSteak\", \"Please See Credits Page\"],\n\t\"description\": \"A full "
},
{
"path": "README.md",
"chars": 3506,
"preview": "# Important\nIf you're having trouble loading the mod, try turning off Pixel Smoothing. This can *significantly* reduce t"
},
{
"path": "assets/shaders/booster.fs",
"chars": 5508,
"preview": "// === GLSL Fix Log ===\n// 修复时间: Mon Jul 21 14:15:41 CST 2025\n// 文件来源: booster.fs\n// 共修改 1 行\n// 第 96 行:\"return transform"
},
{
"path": "assets/shaders/evolution.fs",
"chars": 7156,
"preview": "// === GLSL Fix Log ===\n// 修复时间: Mon Jul 21 14:15:41 CST 2025\n// 文件来源: evolution.fs\n// 共修改 3 行\n// 第 125 行:\"number new_b "
},
{
"path": "assets/shaders/shiny.fs",
"chars": 11684,
"preview": "// === GLSL Fix Log ===\n// 修复时间: Mon Jul 21 14:15:41 CST 2025\n// 文件来源: shiny.fs\n// 共修改 23 行\n// 第 41 行:\"return 1 / (1 + e"
},
{
"path": "assets/shaders/zorua.fs",
"chars": 5697,
"preview": "// === GLSL Fix Log ===\n// 修复时间: Mon Jul 21 14:15:41 CST 2025\n// 文件来源: zorua.fs\n// 共修改 1 行\n// 第 140 行:\"return transform_"
},
{
"path": "backs/backs1.lua",
"chars": 7611,
"preview": "init = function()\n local backapply_orig = Back.apply_to_run\n function Back.apply_to_run(self)\n backapply_orig(self)"
},
{
"path": "blinds/pokebossblind.lua",
"chars": 9868,
"preview": "local mirror = {\n key = \"mirror\",\n dollars = 5,\n mult = 2,\n boss = { min = 3, max = 80 },\n pos = { x = 0, y = 1 },\n"
},
{
"path": "boosters/packs1.lua",
"chars": 15209,
"preview": "local create_energy = function(self, card)\n if pseudoseed('rainbow') < .10 then\n return create_card(\"Spectral\", G.pa"
},
{
"path": "challenges/pokechallenges.lua",
"chars": 15384,
"preview": "local all_cards_enhanced = function(enhancement)\r\nend\r\n\r\nlocal nuzlocke = {\r\n object_type = \"Challenge\",\r\n key = \""
},
{
"path": "config.lua",
"chars": 835,
"preview": "return {\n [\"shiny_playing_cards\"]=false,\n [\"detailed_tooltips\"]=true,\n [\"precise_energy\"]=true,\n [\"pokeballs\"]=true,"
},
{
"path": "consumable types/type1.lua",
"chars": 734,
"preview": "local energy = {\n key = \"Energy\",\n primary_colour = HEX(\"4F6367\"),\n secondary_colour = HEX(\"4ABA8D\"),\n loc_txt = \t{"
},
{
"path": "consumables/00_mart_balls.lua",
"chars": 3650,
"preview": "local pokeball = {\n name = \"pokeball\",\n key = \"pokeball\",\n set = \"Item\",\n loc_vars = function(self, info_queue, cent"
},
{
"path": "consumables/01_mart_energy.lua",
"chars": 7353,
"preview": "-- We can initialize the 12 basic energies (not bird) with this template and a good for loop\nlocal energy_template = {\n "
},
{
"path": "consumables/02_mart_spectral.lua",
"chars": 7822,
"preview": "local transformation = {\n name = \"transformation\",\n key = \"transformation\",\n set = \"Spectral\",\n loc_vars = function("
},
{
"path": "consumables/03_mart_items.lua",
"chars": 33594,
"preview": "local twisted_spoon = {\n name = \"twisted_spoon\",\n key = \"twisted_spoon\",\n set = \"Item\",\n pos = { x = 1, y = 5 },\n a"
},
{
"path": "consumables/04_mart_rare.lua",
"chars": 11155,
"preview": "local leftovers = {\n name = \"leftovers\",\n key = \"leftovers\",\n set = \"Item\",\n helditem = true,\n config = {extra = {j"
},
{
"path": "consumables/05_mart_specific.lua",
"chars": 10518,
"preview": "local leek = {\n name = \"leek\",\n key = \"leek\",\n set = \"Item\",\n helditem = true,\n config = {extra = {num = 1, dem = 2"
},
{
"path": "consumables/06_mart_berry.lua",
"chars": 7749,
"preview": "pokermon.juice_list = {Energy = \"c_poke_berry_juice_energy\", Spectral = \"c_poke_berry_juice_spectral\", Planet = \"c_poke_"
},
{
"path": "consumables/07_mart_jirachi.lua",
"chars": 5654,
"preview": "local fake_banker = {\n name = \"fake_banker\",\n key = \"fake_banker\",\n set = \"Spectral\",\n pos = { x = 4, y = 2 },\n "
},
{
"path": "consumables/08_mart_machine.lua",
"chars": 6935,
"preview": "local function have_rotom()\n local in_pool = false\n local rotom_list = {'rotom', 'rotomh', 'rotomw', 'rotomf', 'rotomf"
},
{
"path": "editions/editions1.lua",
"chars": 4550,
"preview": "local apply_shader = function ()\n SMODS.Shader({ key = 'booster', path = 'booster.fs' })\n SMODS.Shader({ key = 'shiny'"
},
{
"path": "enhancements/enhancement1.lua",
"chars": 4827,
"preview": "-- Enhancements\r\n\r\nlocal hazard = {\r\n key = \"hazard\",\r\n artist = \"PrincessRoxie\",\r\n atlas = \"AtlasEnhancementsBasi"
},
{
"path": "functions/apifunctions.lua",
"chars": 3021,
"preview": "pokermon.load_pokemon = function(item)\n if not item.key then\n item.key = item.name\n end\n if not item.config then\n "
},
{
"path": "functions/debufffunctions.lua",
"chars": 691,
"preview": "-- Describe all the logic for debuffing or undebuffing\r\n\r\n-- return values: true, false, or 'prevent_debuff'\r\nSMODS.curr"
},
{
"path": "functions/dex_order.lua",
"chars": 20481,
"preview": "pokermon.dex_order = {\r\n \"bulbasaur\",\r\n \"ivysaur\",\r\n { \"venusaur\", \"mega_venusaur\", \"gmax_venusaur\" },\r\n \"charmander"
},
{
"path": "functions/displaycard.lua",
"chars": 9663,
"preview": "PokeDisplayCard = Card:extend()\n\nlocal get_default_args_from_existing = function(key, set)\n local defaults = {\n ['Se"
},
{
"path": "functions/energizable_vanilla.lua",
"chars": 14761,
"preview": "local energizable_vanilla = {\n -- j_joker= set = \"Joker\", effect = \"Mult\", cost_mult = 1.0, config = {mult ="
},
{
"path": "functions/energyfunctions.lua",
"chars": 13957,
"preview": "energy_values = {\n mult = .4, mult1 = .4, mult2 = .4,\n chips = .3, chips1 = .3, chips2 = .3, chips3 = .3,\n Xmult = .2"
},
{
"path": "functions/inputmanager.lua",
"chars": 2674,
"preview": "poke_input_manager = {\n double_click_window = 0.3,\n last_clicked = {\n target = nil,\n time = 0,\n },\n subscriber"
},
{
"path": "functions/jokerdisplayfunctions.lua",
"chars": 901,
"preview": "---Returns the second card in a set of cards.\r\n---@param cards table Cards to calculate.\r\n---@return table? # second car"
},
{
"path": "functions/pokecompat.lua",
"chars": 950,
"preview": "---@deprecated use `SMODS.destroy_cards` instead\nremove = function(self, card, context, check_shiny)\n SMODS.destroy_car"
},
{
"path": "functions/pokeconstants.lua",
"chars": 1764,
"preview": "POKE_TYPES = {\"Grass\", \"Fire\", \"Water\", \"Lightning\", \"Psychic\", \"Fighting\", \"Colorless\", \"Dark\", \"Metal\", \"Fairy\", \"Drag"
},
{
"path": "functions/pokedraw.lua",
"chars": 6387,
"preview": "SMODS.Shader({ key = 'zorua', path = 'zorua.fs' }):register()\r\nSMODS.Shader({ key = 'evolution', path = 'evolution.fs' }"
},
{
"path": "functions/pokefamily.lua",
"chars": 11074,
"preview": "local pokermon_family_map = {}\n\nlocal default_family_list = {\n { \"bulbasaur\", \"ivysaur\", \"venusaur\", \"mega_venusaur\" },"
},
{
"path": "functions/pokefunctions.lua",
"chars": 52725,
"preview": "extended_family = {\n tauros = {\"miltank\"},\n unown = {\"ruins_of_alph\", \"unown_swarm\"},\n luvdisc = {{item = true, name "
},
{
"path": "functions/pokespriteload.lua",
"chars": 97378,
"preview": "PokemonSprites = {\n lookup = {},\n artist_lookup = {},\n list = {\n{name = \"bulbasaur\", base = {pos = {x = 0, y = 0}},},"
},
{
"path": "functions/pokeutils.lua",
"chars": 22806,
"preview": "pseudorandom_multi = function(args)\n --Args: array(table), amt(num), seed(string), add_con(function), mod_func(function"
},
{
"path": "functions/uifunctions.lua",
"chars": 13024,
"preview": "create_scry_cardarea = function()\n local config = { card_limit = 0, type = 'scry' }\n config.major = G.deck\n local "
},
{
"path": "jokerdisplay/definitions1.lua",
"chars": 122064,
"preview": "local jd_def = JokerDisplay.Definitions\r\n\r\n\r\njd_def[\"j_poke_bulbasaur\"] = {\r\n text = {\r\n { text = \"+$\", "
},
{
"path": "jokerdisplay/definitions2.lua",
"chars": 58218,
"preview": "\r\nlocal jd_def = JokerDisplay.Definitions\r\n\r\n\r\n--\tChikorita\r\njd_def[\"j_poke_chikorita\"] = {\r\n text = {\r\n { text = \"+"
},
{
"path": "jokerdisplay/definitions3.lua",
"chars": 70386,
"preview": "local jd_def = JokerDisplay.Definitions\n\n--\tTreecko\njd_def[\"j_poke_treecko\"] = {\n text = {\n { text = \"+$\", colour = "
},
{
"path": "jokerdisplay/definitions4.lua",
"chars": 37043,
"preview": "local jd_def = JokerDisplay.Definitions\r\n\r\n\r\n--\tTurtwig\r\n--\tGrotle\r\n--\tTorterra\r\n--\tChimchar\r\n--\tMonferno\r\n--\tInfernape\r"
},
{
"path": "jokerdisplay/definitions5.lua",
"chars": 19858,
"preview": "local jd_def = JokerDisplay.Definitions\r\n\r\n\r\n--\tVictini\r\n--\tSnivy\r\n--\tServine\r\n--\tSerperior\r\n--\tTepig\r\n--\tPignite\r\n--\tEm"
},
{
"path": "jokerdisplay/definitions6.lua",
"chars": 4550,
"preview": "local jd_def = JokerDisplay.Definitions\r\n\r\n\r\n--\tChespin\r\n--\tQuilladin\r\n--\tChesnaught\r\n--\tFennekin\r\n--\tBraixen\r\n--\tDelpho"
},
{
"path": "jokerdisplay/definitions7.lua",
"chars": 8218,
"preview": "local jd_def = JokerDisplay.Definitions\r\n\r\n\r\n--\tRowlet\r\n--\tDartrix\r\n--\tDecidueye\r\n--\tLitten\r\n--\tTorracat\r\n--\tIncineroar\r"
},
{
"path": "jokerdisplay/definitions8.lua",
"chars": 7069,
"preview": "local jd_def = JokerDisplay.Definitions\r\n\r\n\r\n--\tGrookey\r\n--\tThwackey\r\n--\tRillaboom\r\n--\tScorbunny\r\n--\tRaboot\r\n--\tCinderac"
},
{
"path": "jokerdisplay/definitions9.lua",
"chars": 15779,
"preview": "local jd_def = JokerDisplay.Definitions\r\n\r\n\r\n--\tSprigatito\r\n--\tFloragato\r\n--\tMeowscarada\r\n--\tFuecoco\r\n--\tCrocalor\r\n--\tSk"
},
{
"path": "jokerdisplay/definitionsOther.lua",
"chars": 7414,
"preview": "local jd_def = JokerDisplay.Definitions\r\n\r\n\r\n-- Pokedex\r\n--[[\r\njd_def[\"j_poke_pokedex\"] = {\r\n text = {\r\n { tex"
},
{
"path": "localization/de.lua",
"chars": 155689,
"preview": "-- Welcome to de.lua!\n-- de stands for Deutsch Aka German\n\n--Progress report:\n--Update this as you go! Or don't, I know "
},
{
"path": "localization/en-us.lua",
"chars": 329715,
"preview": "-- Welcome to en-us.lua!\r\n-- friendly reminder that in the us we say things like \"color\" and not \"colour\"\r\n-- This is al"
},
{
"path": "localization/es_419.lua",
"chars": 311059,
"preview": "-- Welcome to es_419.lua!\n-- Me gustan los gatonejos y las foquitas :3\n-- heyctf/toffie estuvo aquí\nreturn {\n descrip"
},
{
"path": "localization/es_ES.lua",
"chars": 311294,
"preview": "-- Welcome to es_ES.lua!\n-- Me gustan los gatonejos y las foquitas :3 (ver. españa)\n-- heyctf/toffie estuvo aquí\n-- si a"
},
{
"path": "localization/fr.lua",
"chars": 213576,
"preview": "-- Welcome to fr.lua !\n-- fr stands for French\n\n--Progress report:\n--Update this as you go ! Or don't, I know Cryptid do"
},
{
"path": "localization/id.lua",
"chars": 112323,
"preview": "-- Welcome to id.lua!\n\n--You know, something that came to mind, with all the frequent updates,\n--keeping these up to dat"
},
{
"path": "localization/it.lua",
"chars": 273545,
"preview": "-- Benvenuto in it.lua!\n-- Questo è anche il file predefinito, se ci sono cose qui che \"mancano\" negli altri file, verrà"
},
{
"path": "localization/ja.lua",
"chars": 180100,
"preview": "-- Welcome to ja.lua!\n-- Ja stands for Japan, the country pokémon originates from\n\n--Progress report:\n--Update this as y"
},
{
"path": "localization/ko.lua",
"chars": 249367,
"preview": "-- Welcome to ko.lua!\n-- friendly reminder that in the us we say things like \"color\" and not \"colour\"\n-- This is also th"
},
{
"path": "localization/nl.lua",
"chars": 112234,
"preview": "-- Welcome to nl.lua!\n-- This is the file for Dutch\n\n--Progress report:\n--Update this as you go! Or don't, I know Crypti"
},
{
"path": "localization/pl.lua",
"chars": 112204,
"preview": "-- Welcome to pl.lua!\n\n--Progress report:\n--Update this as you go! Or don't, I know Cryptid doesn't (lmfao)\n\n--[[\nDecks:"
},
{
"path": "localization/pt_BR.lua",
"chars": 239591,
"preview": "-- Welcome to en-us.lua!\n-- friendly reminder that in the us we say things like \"color\" and not \"colour\"\n-- This is also"
},
{
"path": "localization/ru.lua",
"chars": 139275,
"preview": "-- Welcome to ru.lua\n\n--Progress report:\n--Update this as you go! Or don't, I know Cryptid doesn't (lmfao)\n\n--[[\nDecks: "
},
{
"path": "localization/vi.lua",
"chars": 161235,
"preview": "return {\n descriptions = {\n Joker = {\n j_joker = {\n name = \"Joker\",\n "
},
{
"path": "localization/zh_CN.lua",
"chars": 222399,
"preview": "-- Welcome to zh_CN.lua!\n-- 友情提醒,在美国我们说 \"color\" 而不是 \"colour\"\n-- 这也是默认文件,如果其他语言文件缺少条目,游戏将使用此文件作为后备\n\n-- 进度报告: (这是英文文件,所以其实"
},
{
"path": "localization/zh_TW.lua",
"chars": 234984,
"preview": "-- Welcome to zh_TW.lua!\n\n--[[\nDecks: Yes\nJokers: Yes\nSettings/Mod: Yes\nItems: Yes\nEnergy: Yes\nDeck Sleeves (requires De"
},
{
"path": "lovely/UI.toml",
"chars": 3198,
"preview": "[manifest]\nversion = \"1.0.0\"\ndump_lua = true\npriority = 0\n\n\n# Localization color\n[[patches]]\n[patches.pattern]\ntarget = "
},
{
"path": "lovely/controller_support.toml",
"chars": 3146,
"preview": "[manifest]\nversion = \"1.0.0\"\ndump_lua = true\npriority = 0\n\n\n# Controller support for reserving\n[[patches]]\n[patches.patt"
},
{
"path": "lovely/daily_challenge.toml",
"chars": 614,
"preview": "[manifest]\r\nversion = \"1.0.0\"\r\ndump_lua = true\r\npriority = 0\r\n\r\n# Set the seed\r\n[[patches]]\r\n[patches.pattern]\r\ntarget ="
},
{
"path": "lovely/draw_card.toml",
"chars": 681,
"preview": "[manifest]\nversion = \"1.0.0\"\ndump_lua = true\npriority = 0\n\n# Unown Swarm Stickers\n[[patches]]\n[patches.pattern]\ntarget ="
},
{
"path": "lovely/gameplay_functions.toml",
"chars": 7421,
"preview": "[manifest]\nversion = \"1.0.0\"\ndump_lua = true\npriority = 0\n\n\n# Pokermon Family Stake Sticker Logic\n[[patches]]\n[patches.p"
},
{
"path": "lovely/poke_utils.toml",
"chars": 9306,
"preview": "[manifest]\nversion = \"1.0.0\"\ndump_lua = true\npriority = 0\n\n# Evolution functionality\n[[patches]]\n[patches.pattern]\ntarge"
},
{
"path": "lovely/start_up.toml",
"chars": 1955,
"preview": "[manifest]\nversion = \"1.0.0\"\ndump_lua = true\npriority = -1\n\n#Nested check\n[[patches]]\n[patches.module]\nsource = \"setup.l"
},
{
"path": "pokemon/pokejokers_01.lua",
"chars": 50302,
"preview": "--Code for pokemon jokers 001-030\n\n-- Bulbasaur 001\nlocal bulbasaur={ \n name = \"bulbasaur\",\n pos = {x = 0, y = 0},\n c"
},
{
"path": "pokemon/pokejokers_02.lua",
"chars": 42050,
"preview": "--Code for pokemon jokers 31-60\n\n-- Nidoqueen 031\nlocal nidoqueen={\n name = \"nidoqueen\", \n pos = {x = 4, y = 2}, \n co"
},
{
"path": "pokemon/pokejokers_03.lua",
"chars": 48321,
"preview": "--Code for pokemon jokers 61-90\n\n-- Poliwhirl 061\nlocal poliwhirl={\n name = \"poliwhirl\", \n pos = {x = 8, y = 4}, \n co"
},
{
"path": "pokemon/pokejokers_04.lua",
"chars": 52509,
"preview": "--Code for pokemon jokers 91-120\n\n-- Cloyster 091\nlocal cloyster={\n name = \"cloyster\", \n pos = {x = 12, y = 6},\n conf"
},
{
"path": "pokemon/pokejokers_05.lua",
"chars": 58949,
"preview": "--Code for pokemon jokers 121-150\n\n-- Starmie 121\nlocal starmie={\n name = \"starmie\", \n pos = {x = 3, y = 9},\n config "
},
{
"path": "pokemon/pokejokers_06.lua",
"chars": 48785,
"preview": "--Code for pokemon jokers 151-180\nlocal mew ={\n name = \"mew\", \n pos = {x = 12, y = 11},\n soul_pos = { x = 0, y = 12},"
},
{
"path": "pokemon/pokejokers_07.lua",
"chars": 55102,
"preview": "-- Ampharos 181\nlocal ampharos={\n name = \"ampharos\",\n pos = {x = 9, y = 2},\n config = {extra = {Xmult = 1,Xmult_mod ="
},
{
"path": "pokemon/pokejokers_08.lua",
"chars": 58388,
"preview": "-- Qwilfish 211\nlocal qwilfish = {\n name = \"qwilfish\", \n pos = {x = 9, y = 5},\n config = {extra = {hazard_level = 1, "
},
{
"path": "pokemon/pokejokers_09.lua",
"chars": 61856,
"preview": "-- Miltank 241\nlocal miltank={\n name = \"miltank\",\n pos = {x = 9, y = 8},\n config = {extra = {money = 4,}},\n loc_vars"
},
{
"path": "pokemon/pokejokers_10.lua",
"chars": 33038,
"preview": "-- Lombre 271\n-- Ludicolo 272\n-- Seedot 273\n-- Nuzleaf 274\n-- Shiftry 275\n-- Taillow 276\nlocal taillow={\n name = \"taill"
},
{
"path": "pokemon/pokejokers_11.lua",
"chars": 29158,
"preview": "-- Delcatty 301\nlocal delcatty={\n name = \"delcatty\",\n pos = {x = 0, y = 0},\n config = {extra = {energy_buff = 1}},\n "
},
{
"path": "pokemon/pokejokers_12.lua",
"chars": 32926,
"preview": "-- Cacnea 331\nlocal cacnea = {\n name = \"cacnea\", \n pos = {x = 0, y = 0},\n config = {extra = {hazard_level = 1, money_"
},
{
"path": "pokemon/pokejokers_13.lua",
"chars": 37122,
"preview": "-- Snorunt 361\nlocal snorunt={\n name = \"snorunt\",\n pos = {x = 2, y = 11},\n config = {extra = {debt = 15,rounds = 4}},"
},
{
"path": "pokemon/pokejokers_14.lua",
"chars": 10988,
"preview": "-- Monferno 391\n-- Infernape 392\n-- Piplup 393\n-- Prinplup 394\n-- Empoleon 395\n-- Starly 396\n-- Staravia 397\n-- Starapto"
},
{
"path": "pokemon/pokejokers_15.lua",
"chars": 22154,
"preview": "-- Cherrim 421\n-- Shellos 422\n-- Gastrodon 423\n-- Ambipom 424\nlocal ambipom={\n name = \"ambipom\",\n pos = {x = 9, y = 2}"
},
{
"path": "pokemon/pokejokers_16.lua",
"chars": 47965,
"preview": "-- Skorupi 451\n-- Drapion 452\n-- Croagunk 453\n-- Toxicroak 454\n-- Carnivine 455\n-- Finneon 456\n-- Lumineon 457\n-- Mantyk"
},
{
"path": "pokemon/pokejokers_17.lua",
"chars": 3640,
"preview": "-- Mesprit 481\n-- Azelf 482\n-- Dialga 483\n-- Palkia 484\n-- Heatran 485\n-- Regigigas 486\n-- Giratina 487\n-- Cresselia 488"
},
{
"path": "pokemon/pokejokers_18.lua",
"chars": 19983,
"preview": "-- Pansage 511\nlocal pansage = {\n name = \"pansage\",\n pos = { x = 3, y = 1 },\n config = { extra = {} },\n loc_vars = f"
},
{
"path": "pokemon/pokejokers_19.lua",
"chars": 11591,
"preview": "-- Swadloon 541\n-- Leavanny 542\n-- Venipede 543\n-- Whirlipede 544\n-- Scolipede 545\n-- Cottonee 546\n-- Whimsicott 547\n-- "
},
{
"path": "pokemon/pokejokers_20.lua",
"chars": 21278,
"preview": "-- Zoroark 571\nlocal zoroark = {\n name = \"zoroark\", \n pos = { x = 7, y = 5 },\n soul_pos = { x = 99, y = 99 },\n confi"
},
{
"path": "pokemon/pokejokers_21.lua",
"chars": 18360,
"preview": "-- Klinklang 601\n-- Tynamo 602\n-- Eelektrik 603\n-- Eelektross 604\n-- Elgyem 605\nlocal elgyem={\n name = \"elgyem\",\n pos "
},
{
"path": "pokemon/pokejokers_22.lua",
"chars": 3854,
"preview": "-- Heatmor 631\n-- Durant 632\n-- Deino 633\nlocal deino={\n name = \"deino\",\n pos = {x = 13, y = 9},\n config = {extra = {"
},
{
"path": "pokemon/pokejokers_23.lua",
"chars": 3780,
"preview": "-- Fletchling 661\n-- Fletchinder 662\n-- Talonflame 663\n-- Scatterbug 664\n-- Spewpa 665\n-- Vivillon 666\n-- Litleo 667\nloc"
},
{
"path": "pokemon/pokejokers_24.lua",
"chars": 10831,
"preview": "-- Dragalge 691\n-- Clauncher 692\n-- Clawitzer 693\n-- Helioptile 694\n-- Heliolisk 695\n-- Tyrunt 696\n-- Tyrantrum 697\n-- A"
},
{
"path": "pokemon/pokejokers_25.lua",
"chars": 10210,
"preview": "-- Volcanion 721\n-- Rowlet 722\n-- Dartrix 723\n-- Decidueye 724\n-- Litten 725\n-- Torracat 726\n-- Incineroar 727\n-- Poppli"
},
{
"path": "pokemon/pokejokers_26.lua",
"chars": 4007,
"preview": "-- Dewpider 751\n-- Araquanid 752\n-- Fomantis 753\n-- Lurantis 754\n-- Morelull 755\n-- Shiinotic 756\n-- Salandit 757\n-- Sal"
},
{
"path": "pokemon/pokejokers_27.lua",
"chars": 544,
"preview": "-- Dhelmise 781\n-- Jangmo-o 782\n-- Hakamo-o 783\n-- Kommo-o 784\n-- Tapu Koko 785\n-- Tapu Lele 786\n-- Tapu Bulu 787\n-- Tap"
},
{
"path": "pokemon/pokejokers_28.lua",
"chars": 3966,
"preview": "-- Thwackey 811\n-- Rillaboom 812\n-- Scorbunny 813\n-- Raboot 814\n-- Cinderace 815\n-- Sobble 816\n-- Drizzile 817\n-- Intele"
},
{
"path": "pokemon/pokejokers_29.lua",
"chars": 560,
"preview": "-- Flapple 841\n-- Appletun 842\n-- Silicobra 843\n-- Sandaconda 844\n-- Cramorant 845\n-- Arrokuda 846\n-- Barraskewda 847\n--"
},
{
"path": "pokemon/pokejokers_30.lua",
"chars": 14310,
"preview": "-- Pincurchin 871\n-- Snom 872\n-- Frosmoth 873\n-- Stonjourner 874\n-- Eiscue 875\n-- Indeedee 876\n-- Morpeko 877\n-- Cufant "
},
{
"path": "pokemon/pokejokers_31.lua",
"chars": 12880,
"preview": "-- Ursaluna 901\nlocal ursaluna={\n name = \"ursaluna\",\n pos = {x = 2, y = 8},\n config = {extra = {mult = 0,mult_mod = 2"
},
{
"path": "pokemon/pokejokers_32.lua",
"chars": 17537,
"preview": "-- Squawkabilly 931\n-- Nacli 932\n-- Naclstack 933\n-- Garganacl 934\n-- Charcadet 935\nlocal charcadet={\n name = \"charcade"
},
{
"path": "pokemon/pokejokers_33.lua",
"chars": 10185,
"preview": "-- Wugtrio 961\nlocal wugtrio={\n name = \"wugtrio\", \n pos = {x = 4, y = 4},\n config = {extra = {chips = 120, Xmult = 1."
},
{
"path": "pokemon/pokejokers_34.lua",
"chars": 7699,
"preview": "-- Iron Bundle 991\n-- Iron Hands 992\n-- Iron Jugulis 993\n-- Iron Moth 994\n-- Iron Thorns 995\n-- Frigibax 996\n-- Arctibax"
},
{
"path": "pokemon/pokejokers_35.lua",
"chars": 160,
"preview": "-- Raging Bolt 1021\n-- Iron Boulder 1022\n-- Iron Crown 1023\n-- Terapagos 1024\n-- Pecharunt 1025\nreturn {name = \"Pokemon "
},
{
"path": "pokemon/zmissingno.lua",
"chars": 8010,
"preview": "local mseed = \"missingno\"\n--[[\nlocal mmult = function(self, card, context)\n if context.cardarea == G.jokers and context"
},
{
"path": "pokemon/zotherjokers.lua",
"chars": 34906,
"preview": "local pokedex={ \n name = \"pokedex\",\n pos = {x = 0, y = 0},\n config = {extra = {}},\n loc_vars = function(self, info_q"
},
{
"path": "pokemon/zzzapril_fools.lua",
"chars": 11477,
"preview": "local billion_lions = {\r\n name = \"billion_lions\",\r\n pos = {x = 5, y = 12},\r\n soul_pos = {x = 6, y = 12},\r\n config = "
},
{
"path": "pokequips.lua",
"chars": 265,
"preview": "if SMODS.JimboQuip then\n for i=1,10 do\n SMODS.JimboQuip{\n key = \"lose_quip\"..tostring(i),\n type "
},
{
"path": "pokermon.lua",
"chars": 10343,
"preview": "if SMODS.current_mod then\n local loaded, config = pcall(require, \"pokermon.setup\")\n if not loaded then\n error(\"Po"
},
{
"path": "pokesprites.lua",
"chars": 19079,
"preview": "--Visual Code for Pokemon\n--Load config\nlocal lovely = require(\"lovely\")\n\n--Load all Atlas\nlocal joker_basic_atlases = {"
},
{
"path": "pokeui.lua",
"chars": 37851,
"preview": "--Config UI\nlocal energy_toggles = {\n {ref_value = \"unlimited_energy\", label = \"poke_settings_unlimited_energy\", toolti"
},
{
"path": "seals/seals1.lua",
"chars": 7673,
"preview": "local check_main_scoring = function(main)\n if SMODS.version >= '1.0.0~ALPHA-1315b' then\n return main\n else\n retu"
},
{
"path": "setup.lua",
"chars": 120,
"preview": "--This is a dummy file to check if files are nested in the directory. Other setup/install check code can go here as well"
},
{
"path": "sleeves/sleeve.lua",
"chars": 14606,
"preview": "init = function()\n local backapply_orig = Back.apply_to_run\n function Back.apply_to_run(self)\n backapply_orig(self)"
},
{
"path": "stickers/stickers.lua",
"chars": 818,
"preview": "local type_sticker_template = \n{\n prefix_config = {key = false},\n rate = 0.0,\n atlas = \"AtlasStickersBasic\",\n no_col"
},
{
"path": "tags/tags1.lua",
"chars": 9563,
"preview": "local pocket_tag = {\n\tobject_type = \"Tag\",\n\tatlas = \"AtlasTags\",\n\tname = \"pocket_tag\",\n\torder = 25,\n\tpos = { x = 0, y = "
},
{
"path": "vouchers/pokevouchers.lua",
"chars": 2865,
"preview": "local energysearch = { --+1 max energy limit\n\tkey = \"energysearch\",\n\tatlas = \"AtlasVouchersBasic\",\n order = 33,\n set ="
}
]
// ... and 14 more files (download for full content)
About this extraction
This page contains the full source code of the InertSteak/Pokermon GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 136 files (5.0 MB), approximately 1.3M tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.