You are viewing a potentially older version of this package. View all versions.
MADH95Mods-JSON_and_CSV_Loader_Nightly-0.0.4 icon

JSON and CSV Loader Nightly

This is the Nightly version of JSONLoader, this is effectively a preview of whats to come to JSONLoader (and CSVLoader).

Date uploaded 2 days ago
Version 0.0.4
Download link MADH95Mods-JSON_and_CSV_Loader_Nightly-0.0.4.zip
Downloads 15
Dependency string MADH95Mods-JSON_and_CSV_Loader_Nightly-0.0.4

This mod requires the following mods to function

BepInEx-BepInExPack_Inscryption-5.4.2305 icon
BepInEx-BepInExPack_Inscryption

BepInEx pack for Inscryption. Preconfigured and ready to use.

Preferred version: 5.4.2305
BepInEx-MonoMod_Loader_Inscryption-1.0.0 icon
BepInEx-MonoMod_Loader_Inscryption

Loads .mm.dll patches from BepInEx/monomod

Preferred version: 1.0.0
API_dev-API-2.24.0 icon
API_dev-API

The de-facto standard core API for all Inscryption mods. This lets you create new cards, abilities, challenges, map nodes, starter decks, and more.

Preferred version: 2.24.0
Cecil_Libraries_Organization-Cecil_Libraries_Package-1.0.1 icon
Cecil_Libraries_Organization-Cecil_Libraries_Package

This is the OFFICIAL Cecil Libraries Organization Package for the Cecil Libraries. Treat this package as a Dependency Package. The dlls will be added into both Patchers and Plugins folders of your Install.

Preferred version: 1.0.1
Stoat_Games-ANSI_Mod-2.0.1 icon
Stoat_Games-ANSI_Mod

This mod simply enables ANSI and UTF-8 for Windows Terminals e.g. the BepInEx Console, this relies on the Cecil.ANSI_Utils functionality.

Preferred version: 2.0.1

README

JSON Loader V3

The below documentation is likely going to become outdated, the most up to date documentation will be provided via GitHub and Thunderstore WIKI Systems.

This package is now maintained by Chaosyr as of V2.7.0.

If you wish to contribute to the project the GitHub is MADH95/JSONLoader. The Development Branch is: MADH95/JSONLoader/Refactor-JSONLoader-3.

Thank you to the following folks for their amazing Contributations to this Project:

JSONLoader and API 3.0.0 are on the Horizon, JSONLoader's will be first as it's the simpler of the two to upgrade.


JSON and CSV Loader API Documentation

The below sections serve to document the support of each Version of JSONLoader, for more detail or to expand the detail between Updates refer to the JSONLoader Wiki or JSONLoader GitHub Wiki. Notes for Contributing to the Wiki are Outlined on their respective Home Pages.

JSON Inscrybing

All JSONLoader versions require the same things so, heres a unified basics for making things with JSONLoader. First off make sure you have a Keyboard, Mouse, Monitor, File Explorer, and a Text Editor. These are more or less all you need to make JSON's for this mod. However there are some mandatory steps to get your environments prepared.

File Explorer (Windows)

In order for you to make the actual JLDR extension for your cards you'll need to follow the below steps in your File Explorer.

  1. Open File Explorer
  2. Find the (or 3 dots in a row) button, and press it.
  3. Press [Insert a Wrench Here] Options.
  4. In the menu that just popped up you'll see 3 Tabs at the top, press the one labeled View.
  5. Under Advanced Settings: toggle off Hide extensions for known file types, another useful one to toggle would be Show hidden files, folders, and drives.
  6. After you've toggled these press Apply to Folders.
  7. Next, press OK.

Now you should see File Extensions alongside all of your files. As stated before this will allow you to change the File Extension for the mod.

Getting the Path's

Next up you'll likely want to grab a path, namely the one to your Plugins folder. This folder will lie wherever your BepInEx folder is.

If you use a Mod Manager, go to one of the following places:

  • R2ModMan: Settings -> Directories -> Profile Folder -> Browse -> Navigate via File Explorer to BepInEx -> Navigate via File Explorer to plugins -> Go to the File Explorer Address Bar -> Click It -> Hit CTRL+C or the OS Equivalent.
  • GaleModManager: Click File in the Top Bar -> Browse Profile Folder -> Navigate via File Explorer to BepInEx -> Navigate via File Explorer to plugins -> Go to the File Explorer Address Bar -> Click It -> Hit CTRL+C or the OS Equivalent.
  • ThunderstoreModManager: Settings -> Directories -> Profile Folder -> Browse -> Navigate via File Explorer to BepInEx -> Navigate via File Explorer to plugins -> Go to the File Explorer Address Bar -> Click It -> Hit CTRL+C or the OS Equivalent.

If your manual it should be something like:

  1. Navigate to the Games Local Install Folder
  • XboxGames: C:\XboxGames\Inscryption\Content
  • Steam: \steamapps\common\Inscryption after you get to the Steam Install Folder.
  1. Next navigate to BepInEx/plugins
  2. Go to the File Explorer Address Bar -> Click It -> Hit CTRL+C or the OS Equivalent.

Now store that path somewhere you'll remember it, you'll be coming back here a lot over the course of your mod.

Text Editor

The recommended File Editor for JSONLoader is VisualStudioCode as it has built in handlers for both JSON Syntax and CSV Syntax, if your working with JSONLoader at any point this should be your go-to editor, but if you have a preficed editor nothings stopping you from using it. If you don't want to download anything there is a Website called JSONEditorOnline which does similar.

Adding the File Extensions to the Context Menu (Windows 11)

I'm going to include this for those on Windows 11 for other OS's the next section should work fine.

  1. In A Text Editor Create a new File.
  2. Enter the following into the file:
    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\.md]
    @="markdownfile"
    
    [HKEY_CLASSES_ROOT\.md\ShellNew]
    "NullFile"=""
    
    [HKEY_CLASSES_ROOT\markdownfile]
    @="Markdown Document"
    
    [HKEY_CLASSES_ROOT\markdownfile\DefaultIcon]
    @="\"C:\\Users\\Chaos\\AppData\\Local\\Programs\\Microsoft VS Code\\a44adf7f53\\resources\\app\\resources\\win32\\markdown.ico\""
    
    [HKEY_CLASSES_ROOT\.json]
    @="jsonfile"
    
    [HKEY_CLASSES_ROOT\.json\ShellNew]
    "NullFile"=""
    
    [HKEY_CLASSES_ROOT\jsonfile]
    @="JSON File"
    
    [HKEY_CLASSES_ROOT\jsonfile\DefaultIcon]
    @="\"C:\\Users\\Chaos\\AppData\\Local\\Programs\\Microsoft VS Code\\a44adf7f53\\resources\\app\\resources\\win32\\json.ico\""
    
    [HKEY_CLASSES_ROOT\.jldr]
    @="jldrfile"
    
    [HKEY_CLASSES_ROOT\.jldr\ShellNew]
    "NullFile"=""
    
    [HKEY_CLASSES_ROOT\jldrfile]
    @="JSONLoader File"
    
    [HKEY_CLASSES_ROOT\jldrfile\DefaultIcon]
    @="\"C:\\Users\\Chaos\\AppData\\Local\\Programs\\Microsoft VS Code\\a44adf7f53\\resources\\app\\resources\\win32\\json.ico\""
    
    [HKEY_CLASSES_ROOT\.jldr2]
    @="jldr2file"
    
    [HKEY_CLASSES_ROOT\.jldr2\ShellNew]
    "NullFile"=""
    
    [HKEY_CLASSES_ROOT\jldr2file]
    @="JSONLoader2 File"
    
    [HKEY_CLASSES_ROOT\jldr2file\DefaultIcon]
    @="\"C:\\Users\\Chaos\\AppData\\Local\\Programs\\Microsoft VS Code\\a44adf7f53\\resources\\app\\resources\\win32\\json.ico\""
    
    [HKEY_CLASSES_ROOT\.jldr3]
    @="jldr3file"
    
    [HKEY_CLASSES_ROOT\.jldr3\ShellNew]
    "NullFile"=""
    
    [HKEY_CLASSES_ROOT\jldr3file]
    @="JSONLoader3 File"
    
    [HKEY_CLASSES_ROOT\jldr3file\DefaultIcon]
    @="\"C:\\Users\\Chaos\\AppData\\Local\\Programs\\Microsoft VS Code\\a44adf7f53\\resources\\app\\resources\\win32\\json.ico\""
    
    [HKEY_CLASSES_ROOT\.csv]
    @="csvfile"
    
    [HKEY_CLASSES_ROOT\.csv\ShellNew]
    "NullFile"=""
    
    [HKEY_CLASSES_ROOT\csvfile]
    @="CSV File"
    
    [HKEY_CLASSES_ROOT\csvfile\DefaultIcon]
    @="\"C:\\Users\\Chaos\\AppData\\Local\\Programs\\Microsoft VS Code\\a44adf7f53\\resources\\app\\resources\\win32\\html.ico\""
    
  3. Save the file as a [SomeName].reg, then run it.
  4. Next Restart your File Explorer via Task Manager

What this did was add the following file types to your Right Click Context Menu: .md, .json, .jldr, .jldr2, .jldr3, and .csv. So that now when you want to make a new JSONLoader file you can press New -> JSONLoader(X) File in the Context Menu. Note for the Icons this is set to utilize those of Visual Studio Code

Creating the JSON File

Now you'll need to make the actual file for your Item added by JSONLoader. Go to the Plugins folder, then you'll make a new directory or folder under it, this will be your Mod's folder. Make another directory under it called simply plugins this will make your life a little easier when uploading your mods, as the folders will be sticky. Now make a folder called Scripts, this will be where your JSON's are expected to live unless you explicitly define it in a file included in your mod, that's not relevant now though.

Once that's done, Right-Click the window explorer pane in the folder, Select New Text Document or New JSONLoader(X) File, ensure the extension of the file matches the Item your trying to create. Now Open the file in a Text Editor, and insert {} into the file, this is so you have a valid JSON base. Each Support area of the Documentation will cover what to put into this file.

Oh, before I leave you, give this a watch: Web Dev Simplified: Learn JSON in 10 Minutes, this will give you a overview of what JSON is and how to work with it, and it will teach you the terminology.


Artwork Form Support:

We support 3 ways in which you can load images for your Plugin. Below outline each form.

Plugins Folder Scanning:

This is the simplest form, simply just define your pngs name, at the root of the plugins folder. This is for the case where you don't want to make an art folder, and are not releasing the mod.

Relative Path to Image:

What we mean by this is that you can hand us a relative path from your plugins folder to your png. See the Example Card "MyCardWithPathing_example.jldr" for an example of how you can do this.

But the syntax is pretty much just;

  • / after the folders name to indicate we need to go into that folder.
  • ../ before the file or folders name to indicate we need to go up a folder.
  • Plain Text is treated as a folder name.
  • Plain Text followed by .png is treated as the file.

If you want to make sure your syntax is valid open Regexer and place in the Regex: ^(?:(?:\.\.\/|[a-zA-Z\d_\s-]+\/)*[a-zA-Z\d_\s-]+\.png|data:image\/png;base64,[A-Za-z0-9+/]+={0,2}|base64:[A-Za-z0-9+/]+={0,2})$ into the Expression box, and your path into the Text box. If your wondering why it's so long, we are validating 3 data forms in that Regex Patern.

Base64 Encoded Images:

You may not be as familiar with this type of image, but more or less its an image where the image itself is in textual form, specifically encrypted in the format of a 64imal number system (basically there are 64 numbers instead of the usual 10), this is great if you want to keep your art from being included in another person's mod while keeping it in your own (Though someone could always go in the json and copy the base64). It also removed the need to make a physical image for the texture.

Anyways there are two ways in which we validly accept base64 in Texture related fields. The first would be:

  • base64:

This is how its allowed in JSONLoader2's setup (as of writing the Non-Nightly version of JSONLoader) But we also allow for the path variant of base64 as well. E.G.

  • data:image/png;base64,

Note the start of the string if you do it this way MUST MATCH THIS FORMAT. An example Base64 you could pass in would be:

data:image/png;base64,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"

This would decrypt to an image of the Archivist from the game. Though notably with JSONLoader alone this would be an All black image as it contains color, plus with the way we handle things, it portrait breaks, take it as a unintended quirk.

If you want to make sure your syntax is valid open Regexer and place in the Regex: ^(?:(?:\.\.\/|[a-zA-Z\d_\s-]+\/)*[a-zA-Z\d_\s-]+\.png|data:image\/png;base64,[A-Za-z0-9+/]+={0,2}|base64:[A-Za-z0-9+/]+={0,2})$ into the Expression box, and your path into the Text box. If your wondering why it's so long, we are validating 3 data forms in that Regex Patern.


JSONLoaderV1 Support:

This version of JSONLoader supports Cards Exclusively and limited support for Modded Libraries. This is a Maintenance Version, outside of Bug Fixes it will NOT be updated.

JSONLoaderV1 Cards:

JSONLoaderV1 Cards support allows you to well make JSON Based Cards for the Game, note they aren't the most Complex things in this version of the mod.

The following are all of the fields available for JSONLoaderV1 Cards and what they do:

Card Fields
Key Description Type
fieldsToEdit Any items applied within this field will be used for overwriting the In-Game card associated with the field 'name'. String Array
name The In-Code name for the card, please append on a Prefix unique to your mod if you are NOT editing a base game card. For example; "JSONFanMod5_Gorilla". String
displayedName The In-Game name for the card, it can be anything as long as this font can display it; https://font.download/font/heavyweight String
description The In-Game flavor for the card, this will show when receiving the card for the first time, if you want to prevent it being seen from saving use; https://thunderstore.io/c/inscryption/p/creator/Fuck_Dialouge_Saving/ String
metaCategories These Meta-Categories control how your card will show up within the game, see the following page for what each of them do; https://thunderstore.io/c/inscryption/p/MADH95Mods/JSONCardLoader/wiki/5396-vanilla-enums String Array
cardComplexity This controls WHEN your card can show up in the game, see the following page for what each of them do; https://thunderstore.io/c/inscryption/p/MADH95Mods/JSONCardLoader/wiki/5396-vanilla-enums String
temple This controls which temple in Act 2 the card is apart of, as well as meant to determine which Act outside Act 2 the card shows up in, whether mods follow the convention is up to question, but that's what these do. So, Nature is Act 1 and the Nature Temple, Tech is Act 3 and the Technology Temple, Undead is the Grimora Portion of the Finale and the Undead Temple, Wizard is the Magnificus Portion of the Finale and the Magicks Temple. String
baseAttack This value determines the attack value of the card, it cannot be negative. Int
baseHealth This value determines the health value of the card, it cannot be negative or 0. Int
hideAttackAndHealth This boolean value determines whether the Attack and Health of the card should be hidden or not. Boolean
bloodCost This value determines the amount of Blood this card will cost. Int
bonesCost This value determines the amount of Bones this card will cost. Int
energyCost This value determines the amount of Energy this card will cost. Int
gemColors The following 3 values are accepted here: Green for the Green Gem, Orange for the Orange Gem, and Blue for the Blue Gem. Each of these correlates to the Gem Cost of a card. This version of JSONLoader does not support multiple of the same color of gem. String Array
specialStatIcon This determines which Stat Icon to show on the card, this must be used alongside the associated Special Ability. String
tribes This List determines what Tribes are applied to the card, this works with Base Game tribes only. Use a newer version of JSONLoader for Modded Tribes. You can find the full list here; https://thunderstore.io/c/inscryption/p/MADH95Mods/JSONCardLoader/wiki/5396-vanilla-enums String Array
traits This List determines what Traits are applied to this card, this works with Base Game traits only. Use a newer version of JSONLoader for Modded Traits. You can find the full list here; https://thunderstore.io/c/inscryption/p/MADH95Mods/JSONCardLoader/wiki/5396-vanilla-enums String Array
specialAbilities This List determines what Special Abilities are applied to this card, this works specifically with Base Game Special Abilities. For Modded Special Abilities utilize the 'customSpecialAbilities' field. You can find the full list here; https://thunderstore.io/c/inscryption/p/MADH95Mods/JSONCardLoader/wiki/5396-vanilla-enums String Array
abilities This List determines what Abilities are applied to this card, this works specifically with Base Game Abilities. For Modded Abilities utilize the 'customAbilities' field. You can find the full list here; https://thunderstore.io/c/inscryption/p/MADH95Mods/JSONCardLoader/wiki/5396-vanilla-enums String Array
customAbilities This List determines the Modded Abilities that will be applied to this card. You may find this to be a useful resource; https://github.com/Chaosyr/SaxbyModEnums/wiki AbilityData Array
customSpecialAbilities This List determines the Modded Special Abilities that will be applied to this card. You may find this to be a useful resource; https://github.com/Chaosyr/SaxbyModEnums/wiki SpecialAbilityData Array
evolution This Object determines the Evolution related Parameters for this card, such as what it will turn into, and how long it will take to turn into it. EvolveData
defaultEvolutionName This determines what the Default Evolution Name will be, note it will appear in the format of; '[defaultEvolutionName] [displayedName]', just replace the variables with your JSON's values. String
tail This Object determines the LooseTail related Parameters for this card, such as this cards Texture after losing its tail, or the Card the Tail Will Be. TailData
iceCube This Object determines the IceCube related Parameters for this card, namely what card it will be turned into, if left empty the default is an Opossum. IceCubeData
flipPortraitForStrafe A bool determining whether this cards portrait will flip when the card moves. (like the sigil icon does) Boolean
onePerDeck A bool determining if there can only be one copy of this card within the Player's deck. Boolean
appearanceBehavior This List determines the Appearance Behaviors in which will be applied to this card. Use a newer version of JSONLoader for Modded Appearance Behaviors. You can find the full list here; https://thunderstore.io/c/inscryption/p/MADH95Mods/JSONCardLoader/wiki/5396-vanilla-enums String Array
texture The Path to your cards Portrait, this is localized to your Plugins Folder. It's your job to keep it organized, do it as you would these 'JLDR' files. This must be a PNG File and must be a '114x94' image. String
altTexture The Path to your cards Alternative Portrait, this is localized to your Plugins Folder. It's your job to keep it organized, do it as you would these 'JLDR' files. This must be a PNG File and must be a '114x94' image. This applies in the case you have a Goat's Eye or possibly some other cases. String
emissionTexture The Path to your cards Emissive Portrait, this is localized to your Plugins Folder. It's your job to keep it organized, do it as you would these 'JLDR' files. This must be a PNG File and must be a '114x94' image. This applies in the case you've transferred a sigil at the Sacrificial Stones onto this card. String
titleGraphic The Path to your cards Title Graphic, this is localized to your Plugins Folder. It's your job to keep it organized, do it as you would these 'JLDR' files. This must be a PNG File and must be a '113x28' image. This applies specifically over your card name as a way of obscuring it like the Tentacle Cards are. String
pixelTexture The Path to your cards Pixel Portrait, this is localized to your Plugins Folder. It's your job to keep it organized, do it as you would these 'JLDR' files. This must be a PNG File and must be a '41x28' image. This applies specifically in Act 2, its just that act's version of the card portrait. String
decals This is a list of all the Decal Images in which will be stacked onto your card, this is localized to your Plugins Folder. It's your job to keep it organized, do it as you would these 'JLDR' files. This must be a PNG File and must be a '125x190' image. String Array
AbilityData Object
Key Description Type
name This is the In-Code name of the Ability. String
GUID This is the Ability Libraries GUID, it's a similar concept to your card's prefix. String
SpecialAbilityData Object
Key Description Type
name This is the In-Code name of the Special Ability. String
GUID This is the Special Ability Libraries GUID, it's a similar concept to your card's prefix. String
EvolveData Object
Key Description Type
name This represents the In-Code name of the card this card is meant to evolve into. String
turnsToEvolve This value represents the amount of turns it takes for this card to evolve. This version's Turn Count must be between 1-3 for more use a newer version of JSONLoader. Int
TailData Object
Key Description Type
name This represents the In-Code name of the card this card will leave in its old lane if Loose Tail triggers. String
tailLostPortrait The Path to your cards Tail Lost Portrait, this is localized to your Plugins Folder. It's your job to keep it organized, do it as you would these 'JLDR' files. This must be a PNG File and must be a '114x94' image. This applies specifically when this card is struck and lost its tail. String
IceCubeData Object
Key Description Type
creatureWithin This represents the In-Code name of the card this card will leave behind in its place when it is to die. String

JSONLoaderV2 Support:


JSONLoaderV3 Support:


CSVLoader Support:


Configuration

With the API we offer some Configuration which you can find located in: Chaosyr.MADH95.Inscryption.JSON.CSVLoader.cfg. The following is an overview of what you can configure and what they will do affecting the API of JSON and CSV Loader.

JSON Loading Origination Path

This is effectively a CSV as a value. All values passed into it must be Paths using similar logic to that seen in the Artwork Form Support section of this README.

By default, this value is set to: Scripts, Plugins/Scripts, Cards, Plugins/Cards to make mods work without the User needing to configure this. But if you need more Paths just add them to the end of the CSV.

These paths are Relative to your mods specific folder under the plugins folder, well more so any mod specific folder under the plugins folder but yes.

This value effects what folders JSON Loader will recursively load JSON's from.

CSV Loading Origination Path

This is effectively a CSV as a value. All values passed into it must be Paths using similar logic to that seen in the Artwork Form Support section of this README.

By default, this value is set to: Sheets, Plugins/Sheets to make mods work without the User needing to configure this. But if you need more Paths just add them to the end of the CSV.

These paths are Relative to your mods specific folder under the plugins folder, well more so any mod specific folder under the plugins folder but yes.

This value effects what folders CSV Loader will recursively load CSV's from.

Schema Save Path

This must represent one SINGULAR path, similar to those above. This path is relative to the DLL this API takes root within.

The default value is /Schemas.

Show Verbose Logging

It's less of a Verbose Logging but when set to true, the API will output Debug information in the Console and in the Log File.

Show Additional Information

When this value is set to true the API will output some Additional Information with common errors with the API. Think o it as a modmakers tooling. This will be outputted to the File and Console.

Show Summary Information

When this value is set to true when the API is validating Item's against their related Schema's, it will print the description of those properties as well. Again both to the Console and Log File.

Recursively Scan At Plugin Level

Compatibility mode that makes the File Finder recursively scan from the Plugin Level rather than from the specified Path's levels in their respective configs.


Installation

<u>FOR LINUX AND STEAMDECK: Ensure that the game is set to run using Proton in he game settings on steam. Should be a setting like this: Change launch behaviour -> Proton.</u>

Installing with a Mod Manager

  1. Download and install Thunderstore Mod Manager, Gale or r2modman.
  2. Click the Install with Mod Manager button on the top of BepInEx's page.
  3. Run the game via the mod manager.

If you have issues with Mod Managers head to one of these discords;

  • Thunderstore Support Discord: Here
  • R2ModMan Support Discord: Here
  • Gale Mod Manager Support Discord: Here

Installing Manually

  1. Install BepInEx by pressing Manual Download and extract the contents into a folder. Do not extract into the game folder!
  2. Move the contents of the BepInExPack_Inscryption folder into the game folder (where the game executable is; usually found here: C:\Program Files (x86)\Steam\steamapps\common\Inscryption).
  3. Run the game. If everything was done correctly, you will see the BepInEx console appear on your desktop. Close the game after it finishes loading.
  4. Install MonoModLoader and extract the contents into a folder.
  5. Move the contents of the patchers folder into BepInEx/patchers (If any of the mentioned BepInEx folders don't exist, just create them).
  6. Install Inscryption API and extract the contents into a folder.
  7. Move the contents of the plugins folder into BepInEx/plugins and the contents of the monomod folder into the BepInEx/monomod folder.
  8. Run the game again. If everything runs correctly, a message will appear in the console telling you that the API was loaded.
  9. For any additional mods create a new subfolder, it can be called anything and extract the zips archive into it and if there is a BepInEx folder within the zip instead drop the contents of that folder into the BepInEx root for the modding instance. EX;
    BepInEx // These go within the BepInEx root folder
    |-- config
    |-- patchers
    |-- plugins
    |-- monomod
    |-- core
    plugins // Files within go into the created plugin subfolder that was created for the mod
    |-- Art
    |-- Scripts
    |-- MyMod.dll
    manifest.json // Ignorable, but if kept, goes in plugin subfolder
    README.md // Ignorable, but if kept, goes in plugin subfolder
    CHANGELOG.md // Ignorable, but if kept, goes in plugin subfolder
    icon.png // Ignorable, but if kept, goes in plugin subfolder
    
  10. Run the game once more and everything should be correct and working.

Installing Manually (XBOX Game-Pass)

  1. Install BepInEx by pressing Manual Download and extract the contents into a folder. Do not extract into the game folder!
  2. Move the contents of the BepInExPack_Inscryption folder into the game folder (where the game executable is; usually found here: C:\XboxGames\Inscryption\Content).
  3. Install the following package: XboxSilencio, this is a package which aims to solve frictions with XBOX Gamepass specific installations, such as HueyFS related errors.
  4. Run the game. If everything was done correctly, you will see the BepInEx console appear on your desktop. Close the game after it finishes loading.
  5. Install MonoModLoader and extract the contents into a folder.
  6. Move the contents of the patchers folder into BepInEx/patchers (If any of the mentioned BepInEx folders don't exist, just create them).
  7. Install Inscryption API and extract the contents into a folder.
  8. Move the contents of the plugins folder into BepInEx/plugins and the contents of the monomod folder into the BepInEx/monomod folder.
  9. Run the game again. If everything runs correctly, a message will appear in the console telling you that the API was loaded.
  10. For any additional mods create a new subfolder, it can be called anything and extract the zips archive into it and if there is a BepInEx folder within the zip instead drop the contents of that folder into the BepInEx root for the modding instance. EX;
    BepInEx // These go within the BepInEx root folder
    |-- config
    |-- patchers
    |-- plugins
    |-- monomod
    |-- core
    plugins // Files within go into the created plugin subfolder that was created for the mod
    |-- Art
    |-- Scripts
    |-- MyMod.dll
    manifest.json // Ignorable, but if kept, goes in plugin subfolder
    README.md // Ignorable, but if kept, goes in plugin subfolder
    CHANGELOG.md // Ignorable, but if kept, goes in plugin subfolder
    icon.png // Ignorable, but if kept, goes in plugin subfolder
    
  11. Run the game once more and everything should be correct and working.

Installing on the Steam Deck

  1. Download r2modman on the Steam Deck's Desktop Mode and open it from its download using its AppImage file.
  2. Download the mods you plan on using and their dependencies.
  3. Go to the setting of the profile you are using for the mods and click Browse Profile Folder.
  4. Copy the BepInEx folder, then go to Steam and open Inscryption's Properties menu
  5. Go to Installed Files click Browse to open the folder containing Inscryption's local files; paste the BepInEx folder there.
  6. Enter Gaming Mode and check 'Force the use of a specific Steam Play compatibility tool' in the Properties menu under Compatibility.
  7. Go to the launch parameters and enter WINEDLLOVERRIDES="winhttp.dll=n,b" %command%.
  8. Open Inscryption. If everything was done correctly, you should see a console appear on your screen.

Mac & Linux

  1. Follow the steps here first: https://docs.bepinex.dev/articles/user_guide/installation/index.html
  2. Next do steps 4-10 of the Manual Installation
  3. Your game should be setup for inscryption modding now

If you have any issues with Mac/Linux, Steam Deck, or Manual head over to the discord for this game:

  • Inscryption Modding Discord: Here

Installing from the GitHub Package:

<u>If your using MadH95-JSONCardLoader for JLDR2 based mods, please make sure to go into MADH.inscryption.JSONLoader.cfg and disable JLDR Conversion, you may need to do this after launching the first time. If you don't JSONLoader in combination with JSONLoader-Nightly will register the card Twice to the Game.</u>

Manager

  1. Find the package that correlates with your system, below is a quick reference of the RID's and what they correlate to;
  • Win-x64: XBOX Gamepass Version of the game (based on the game on Windows)
  • Win-x86: For the Steam Version of the game (based on the game on Windows)
  • We also offer versions for the following:
    • Linux-Arm64
    • Linux-Arm
    • Linux-Musl-Arm64
    • Linux-Musl-X64
    • Linux-X64
    • OSX-Arm64 (Mac)
    • OSX-X64 (Mac)
    • Win-Arm64
  1. Enter your Mod Manager and Import as a Local Mod via the Following Steps:
  • R2ModMan
    1. Open the Application, Navigate to Inscryption, Navigate to the Profile you wish to Install to.

    2. Press Settings.

    3. Type Import into the Search box as highlighted below

      image
    4. Press Import Local Mod.

    5. Press Select File and Navigate to and Select the File you just downloaded from this Release.

    6. If you followed the steps correctly it should appear as follows (with the correct version of this GitHub release,

      image

      <u>For this version it should so 0.0.4 when importing.</u>

    7. Where it says Author: Unknown replace the Unknown with MADH95.

    8. Press Import Local Mod.

    9. Wait for Dependencies to Resolve and your set. (Note for any mods on Thunderstore needing an older version of JSONLoader you may want to also install them directly from the website, or do these steps after you finished installing those mods, you must remove ONLY the old version of the mod.)

  • Gale
    1. Open the Application, Navigate to the Game, Than the Profile.
    2. At the top of the screen (on the left) press Import than ... Local Mod.
    3. Navigate to and Select the File you just downloaded from this Release.
    4. Wait for Dependencies to Resolve and your set. (Note for any mods on Thunderstore needing an older version of JSONLoader you may want to also install them directly from the website, or do these steps after you finished installing those mods, you must remove ONLY the old version of the mod.)

Manual

  1. Find the package that correlates with your system, below is a quick reference of the RID's and what they correlate to;
  • Win-x64: XBOX Gamepass Version of the game (based on the game on Windows)
  • Win-x86: For the Steam Version of the game (based on the game on Windows)
  • We also offer versions for the following:
    • Linux-Arm64
    • Linux-Arm
    • Linux-Musl-Arm64
    • Linux-Musl-X64
    • Linux-X64
    • OSX-Arm64 (Mac)
    • OSX-X64 (Mac)
    • Win-Arm64
  1. Extract the Zip to a new folder.
  2. Take the files and folders under plugins of the zip and move them up a folder.
  3. Delete the plugins folder from the Extracted directory.
  4. Now navigate to the location of your BepInEx install from your earlier setup for the API.
  5. Navigate to plugins and add a folder entitled MadH95-JSON_and_CSV_Loader_Nightly.
  6. Move the setup from steps 2-4 into the folder you created in step 7.

Support

If you need help with anything related to this API or Package head to the Inscryption Modding.

If its related to Installation and not Mod Manager related please use Modding Help, otherwise if it is Mod Manager related head to their respective discords as linked earlier.

If its related to the Behavior of the API in relation to the mod your making use the JSONLoader channel, if its related to mods by others use Modding Help.

If you need anything specific from the maintainer of this Package contact: @thincreator3483 on discord.

CHANGELOG

CHANGELOG

JSONLoader 3.0.0 Changelog

3.0.0-Nightly-0.0.5

  • Fixed IceCube not loading correctly on boot (it used to check for the wrong depth.)
  • Fixes allJLDRCardsPublic for automatic updating as cards are loaded.
  • Add Non-Debug logging for successful addition of cards.
  • Fix potential loading issue due to versioning.

3.0.0-Nightly-0.0.4

  • Fixed the Image Related Regexes provided under JSONLoaderV1's Card Object.
  • Added Ability for Image Paths to be just the FileName, in this case we try to recursively search the Plugin Folder for the image.
  • Added Compatibility Option for ensuring older JSONLoader Mods continue to work.
  • Defaulted Verbose to False like it was meant to be.
  • Updated README.
  • Updated Default Routes for finding JSON's.

3.0.0-Nightly-0.0.3

  • Implemented a JSON Schema Loader.
  • Added another Level of Toggleable Logging.
  • Adjusted some Level's colors and looks.
  • MADE A FULL FLEDGED JSON LINTER.
    • This takes our Schema created by WriteSchema, and the JSON passed in by whatever Utils a JSONLoader Version utilizes. Than with that cross references them and validates the JSON, including Syntax, and value validation.
    • The Linter gives relatively in-depth feedback on how the error can be fixed, even more depth with "AdditionalInformation", "Summary", and "Debug" logging enabled.
    • Keep in mind this Linter is NOT feature complete yet. But it's up to standards with what was needed for JLDR or JSONLoaderV1.
  • Implemented Utilities for ImageScanning in the class ScanImages, with it we support Base64 images, and file images (With relative path support.)
  • Updated FindFiles and LoadFiles to pass the Plugin through the system to the relevant loaders.
  • Fixed Tooltip Disector to account for | appearing within a Regex or Variable.
  • Implemented relatively full-fledged working JLDR support, it may be rough around the edges, so if you find any bugs please report them in the Inscryption Modding discord.
  • Implemented a CardObject that handles passing JLDR cards into the API via CardManager.New().
  • This Version marks the beginning of Nightly Releases for JSONLoader, updates will vary based on Maintainer Availability, but ideally faster than the main API that way you can test features in advance.
  • Added Exclusion for _example in file loading for .jldr, .jldr2, .jldr3, and .csv.
  • Can now Log to the File as well, we have to do this specially because we Log with Console.WriteLine() internally.
  • Officially Licensed the Code for JSONLoader Nightly.

3.0.0-Nightly-0.0.2

  • Implemented Configuration for:
    • JSON Loading Origination Path:
      • "These paths are case insensitive, and determine where JSON Scripts may be sourced from in order to load. If your a mod maker shipping mods, make a 'plugins' folder in your mods folder, and put a folder in there called 'scripts', this is where your JSON scripts should reside. If you need another path, you can override this value with your mod, we'll provide a system for you to do so."
    • CSV Loading Origination Path
      • "These paths are case insensitive, and determine where CSV Sheets may be sourced from in order to load. If your a mod maker shipping mods, make a 'plugins' folder in your mods folder, and put a folder in there called 'sheets', this is where your CSV Sheets should reside. If you need another path, you can override this value with your mod, we'll provide a system for you to do so."
    • Schema Save Path
      • "This determines where JSON Schemas will be saved to as we create them, this path will be localized to the DLL's folder. You can use '../' to mean go up a folder."
    • Show Verbose Logging
      • "While this value is set to true, this API will show what is happening when its happening."
    • Show Additional Information
      • "While this value is set to true, this API will show a more in depth lense as to what went wrong, and try to help explain why its wrong with links to references."
  • Implemented a File Finder based on the JSON Loading Origination Path and CSV Loading Origination Path.
  • Implemented a Bare-Bones File Loader, this basically takes the Files which were found and passes them to the relevant sections of JSONLoader.
  • Implemented a Full-Fledged JSON Schema Writer which can be expanded upon. Related Components:
    • XML Parser; ReadDocumentationFile
    • JSON_Schema; WriteSchema
    • Tooltip_Parser; TooltipDisector
      • Note with this one, the Tooltip Attributes attached to JSON Objects have their own Programming Language in a sense, I'll add the documentation to this versions README under JSONLoader Maintainer Documentation.
  • Added some Empty Classes which will be apart of the JSON Loading Process including a class setup for the purposes of Linting JSONs and another for Parsing JSONs.
  • Added JSONLoaderV1 Support for the Card Object and the start of the handler for actually adding the Cards into the game.
  • Revamped the ENTIRE README.md
  • Possibly some other stuff I'm forgetting about.

3.0.0-Nightly-0.0.1

  • Removed API Dlls from the Repository, migrate to TS-Nuget.
  • Created the Basic Configuration for the JSON AND CSV Loader API.
  • Created Colored Logging for the API using Cecil.ANSI_Utils. (yes while this does add 2 more dependencies, it's useful for color coding our mods logging, as well as formatting it.)
  • Began the process of refactoring the system in which JSONLoader will operate with.
  • JSONLoaderOld will be entirely rewritten by the time we're done with it.
JSONLoader 2.0.0 Changelog

2.7.0

  • Integrate a new TS-Build.bat system to automate package creation for Thunderstore (Supporting runtimes for Windows, Linux, and Mac)
  • Refactor Repository to be much nicer for someone wanting to work on it.
  • Fix the usings in Interpreter.cs under Configils to be all above the namespace.
  • Rework the Repositories Dependency System for purposes of Building and making sure we can depend without it going to the Thunderstore Package.
  • Add a runner associated with the bat which automatically runs with the correct terminal system. (If your a MAC/LINUX user feel free to make a version of TS-Build.bat and I can hook it in!)
  • Move Examples, Schemas, and anything package related to Thunderstore-Package-Elements.
  • Rename class Program.cs to Plugin.cs.
  • Upgraded BepInEx related Dependencies, and adopted BepInEx.AssemblyPublicizer.MSBuild 0.4.3 for publicizing dependency dlls.
  • Added a Authors section to the .csproj listing all contributors to the JSONLoader GitHub.
  • Fixed the NoWarn XML Property, and made it universal.
  • Prevent NuGet packages from being outputted on Publish/Build, and prevent all dlls except from jsonloader from coming into the Publish Folder (Our TS-Build automatically handles dlls that need to be copied over).
  • Change Frameworks to 4.7.2, adopt a proper RootNamespace.
  • If Private is set to True on a dll it will copy into the build folder when doing a regular net build.
  • Believe that covers everything, apologies if anything got missed!

Overall this commit pretty much acts as a refactor of the base repository for a future refactor of the codebase (I'll toss a new branch up for it, plan to rebuild from semi-scratch)

For Thunderstore Packages for this game I'd advise using netframework4.7.2-win-x64-Release.zip or netframework4.7.2-win-x64-Debug.zip when Uploading.

Debug is basically a Prerelease and Release is a Release. With the setup if ReleaseMode is set to anything asides from Release it will be treated as Prerelease/Debug

When doing GitHub releases I'd advising taking all zips of the Prerelease or Release Net folder into the downloads section ^^

If you have any questions contact @thincreator3483 on discord.

Also this was tested fully locally to ensure everything worked, the only thing that doesn't is @JamesVeug's Export Utilities I'm not sure why its broken.

2.6.0

  • Added JLDR2 support for regions
  • Added JLDR2 support for power stats
  • Added JLDR2 support for traits
  • Added JLDR2 support for items
  • Added JLDR2 support for bottled cards
  • Moved exported JLDR2 content to Example folder
  • Fixed exporting cards not exporting all details (including localization)
  • Fixed localization not working on cards/sigils... etc
  • Added more json support
    • Can now embed textures in json using base64: prefix
    • float, color, vector2, all Array types, private serialized fields and public properties
    • Incorrectly named fields will now log to console and suggest the correct name
    • Errors resulting from loading a .jldr2 file will show which file caused it now
    • Fixed JSONLoader not loading anything else if 1 configil errors
  • Configils
    • Now supports localization (Abilities, Special Abilities and Stat Icons)
    • Fixed a bug where configils will break if abilityBehaviour is not specified
    • Fixed OnLoad and OnHealthLevel not working
    • Fixed Behaviours not running when a card is attacked and killed
    • Fixed Change Appearance not working
  • New features added to the API
    • Mods can now add custom variables to configils
    • Mods can now add custom actions to configils
    • Mods can now add file name extension exceptions (for example a mod can make jsonloader not load any files ending with "_theme.jldr2")

2.5.4

  • made it so JSONLoader now loads files that end in "_example.jldr2"
  • made it so JSONLoader now ignores the "Examples" folder instead of the whole JSONLoader folder

2.5.3

  • fixed abilityLearnedDialogue
  • rewrote buffCards (again) to make it cleaner and work faster
  • added the changeAppearance field which has this format:
    "changeAppearance": [{
    "changePortrait": "portrait.png",
    "changeName": "Elder ([BaseCard.Info.displayedName])",
    "addDecals": [ "decal1.png", "decal2.png" ],
    "removeDecals": [ "decal3.png", "decal4.png" ]
    }]
    
  • added the OnDamageDirectly trigger which triggers when a card deals direct damage to the opponent, it has two variables [HitSlot] and [DamageAmount]
  • added the [DeathSlot] variable to the OnPreKill and OnPreDeath triggers
  • added a field called isPermanent to buffCards
  • made buffCards and transformCards point the camera at the hand instead of the board if the card that they're modifying is in the hand
  • added a function called SetVar which has this format: SetVar('function_name', 5) (currently gets resets after all actions caused by the current trigger have happened, but i will try to fix that later though)
  • added support for comments in any jldr2 file, comments are to be used in this format:
    //This changes the appearance of a card
    "changeAppearance": [{
    "changePortrait": "portrait.png", //This changes the portrait of the card
    "changeName": "Elder ([BaseCard.Info.displayedName])", //This is just like evolve!
    "addDecals": [ "decal.png" ] //And last but not least i add a decal to the card here
    }]
    
  • fixed generated variables causing an error if one of their variables were null
  • updated NCalcExtensions to the latest version
  • made it so all fields in configils can be empty or only whitespace without it causing an error
  • cleaned up some code
  • rewrote the readme and some file names for better consistency
  • updated the card names file, changelog and the configils documentation

Changes made by James in this Release <3

  • fields in JSONLoader are no longer case sensitive and can be upper or lower case to avoid errors.
  • Tribe file extensions now support tribe.jldr2 and tribes.jldr2 to avoid errors.
  • Fixed reload and export hotkeys inverted.
  • Fixed JSONLoader not loading cards with non-english characters.

2.5.2

  • Fixed Emissions not working
  • Fixed mods with a custom tribe failing to load
  • Fixed cards overriden with JSON missing fields that aren't specified
  • Fixed Configils breaking due to parameters not being parsed correctly
  • Exposed hotkeys as configs to fit individual needs. (See config for more info)
  • _example cards are ignored yet again (This wasn't meant to be removed)

2.5.1

  • Fixed Encounters throwing errors when importing cards form mods
  • Incorrectly named cards will now throw an error and suggest names of similarly named cards.
  • Errors in .jldr2 files now log more information when they occur.

2.5.0

  • Bumped API requirement to 2.18.2
  • Added custom mask support (With example .jldr2 and .schema!)
  • Added custom language support (With example .jldr2 and .schema!)
  • Added translation support for cards using displayName and description.
  • Added support for overriding existing encounters
  • Added hotkey to export all compatible content to .jldr2 (Left Control + Right Control + X)
  • Added config to enable verbose logging to help debugging
  • Added Tribe .jldr2 example
  • Reduced the amount of times JSONLoader looks for files when starting the game
  • Moved Change notes from Readme to ChangeLog.md
  • Updated 8 Fucking bears card example. Includes custom tribe example

2.4.5 (configil patchnotes)

  • rewrote and cleaned up a ton of code
  • added the triggers: OnPlayerStartOfTurn, OnOpponentStartOfTurn, OnPlayerEndOfTurn and OnOpponentEndOfTurn
  • fixed retainMods removing the evolve sigil from the card because of some left over code from evolve
  • added targetCard to the card object
  • fixed a bug where the game would softlock when infused was not set in addAbilities
  • fixed targetCard only working with singular variables and not with things like functions, this does mean that targetCard will now require variables to be encased in parentheses to enable NCalc
  • fixed a bug where if you set one sigil to be infused in addAbilities that it would make all infused
  • changed removeAbilities to now be a list in this format:
    "removeAbilities": [{
    "list": "",
    "name": "",
    "all": ""
    }]
    
  • added a new field to removeAbilities called "all", when this field is set to true all instances of a sigil will be removed from a card instead of just one (this also means that the default for removing sigils isn't removing all instances of that sigil anymore, but now just one)
  • added a new field called "list" to both addAbilities and removeAbilities, this field can be set to any list and will add/remove any sigils from that list from the targeted card
  • added a "damageSource" field to damageCards which functions like targetCard but changes what card the game will think the damage came from, this field can be set to "null" to have there be no damage source
  • changed gemCost in activationCost to be gemsCost instead to be in line with the card jldr2's
  • added a function called ListContains() which can be used to see if a list contains a certain object
  • added a couple of general use functions to check if a card has a certain "modifier" called: HasAbility(card, ability), HasTribe(card, tribe), HasTrait(card, trait) and HasSpecialAbility(card, specialAbility)
  • added a couple of functions to get the object of a specific type from it's name: Ability('GuidPlusName'), Tribe('GuidPlusName'), Trait('GuidPlusName') and SpecialAbility('GuidPlusName'). Here's an example of how you could use the Ability() function: (HasAbility([BaseCard], Ability('Submerge')))

(an object is basically just a container with information about something, so for example the object of a sigil contains things like: the name, the guid, the description, the metacategories etc.)

2.4.3

  • Actually added the file now

2.4.2

  • Readded an important file that i deleted because i thought it wasn't important :P

2.4.1

  • Fixed the patchnotes

2.4.0 (configil patchnotes)

  • Added a maxEnergy field to gainCurrency (coded by UwUMacaroniTime)
  • Made configils run much faster and have better performance (coded by kelly betty)
  • Fixed any errors relating to a sigil trying to access the card that it is on after it has died or has been removed from the board
  • Fixed the passive trigger spamming the console and cards dying when their attack was set to 0 when using the passive trigger
  • Fixed gainCurrency foils only being visual and not actually increasing the foil amount
  • Added a [DamageAmount] variable to both OnStruck and OnDamage
  • Fixed runOnCondition not working for sendMessage
  • Added two new variables [card.TemporaryMods] and [card.AllAbilities]

2.3.0

  • Added talking card support!

2.3.0

  • Added talking card support!

2.2.4

  • Added gramophone support

2.2.3

  • Added encounter support
  • Removed the [PlayerSlot()] and [OpponentSlot()] variable and replaced it with the GetSlot() function with this format: GetSlot(index, isOpponentSlot, fields) (fields is everything that you would have after the first dot of the original variable in single quotation marks)
  • Fixed a ton more configil bugs

2.2.2

  • Added tribe support

2.2.1

  • Added card and sigil reloading and fixed a ton of bugs with configils

2.2.0

  • Added API for adding cards

2.1.1

  • Added configils (made by Lily#7394)

2.1.0

  • Added starter deck support with help from Lily

2.0.1

  • Fixed a defect with converting JLDR to JLDR2 as it relates to editing base game cards
  • Base game cards are now edited directly instead of using the event. This fixes issues where copies of those cards still existed in other places but wouldn't get properly edited (example: Pack Rat).

2.0.0

  • Rewritten to be compatible with API 2.0
JSONLoader 1.0.0 Changelog

1.7.2

  • Added check for "_example" on the end of file name to remove example files from loading

1.7.1

  • Fixed discrepancies in ancillary files

1.7.0

  • Fixed error when assigning temple on custom cards
  • Removed TestDeck to be released as an individual mods
  • Support for customSpecialAbilities in API v1.12
  • Support for mod manager with custom .jldr extension on card files
  • cost changed to bloodCost in accordance with API
  • Refactored JLUtils into clearer classes
  • Removed redundant variables (evolve_evolutionName, etc.)
  • Alphabetized Card Names.txt
  • Made Enums.md more infomrative

v1.6.1

  • Fixed error if abilities array is present but empty

v1.6.0

  • Added support for adding custom abilities implemented by other mods

v1.5.3

  • Changed default "metaCategories" to be an empty list
  • Added ChangeLog.md

v1.5.0

  • Compatability patch for InscryptionAPI v1.11
  • Refactored Code:
    • Error checking no longer uses exception handling to funciton
    • Game will load default deck if the names in the config for testdeck don't exist
    • baseHealth and metaCategories are handled before the call to NewCard.Add to avoid bloat in the function call
    • Removed Evolve/Tail/IceCubeParams handling to utilise API's handling of those aspects instead
    • Added ErrorUtil to better help with error logging
    • Made use of new json parser to read in Evolve/Tail/IceCubeData from json objects

v1.4.0

  • Changed json parser from Unity's JSONUtility to TinyJson

v1.3.11

  • Fixed error with png check

v1.3.10

  • Added check for textures being png files

v1.3.9

  • Fixed bug where textures were being assigned wrong

v1.3.8

  • Fixed bug where "altTexture", "pixelTexture" and "titleGraphic" were being set to "texture"

v1.3.6

  • Fixed linking error from update v1.3.5 Refactored Code:
    • Seperated EvolveData, TailData, and IceCubeData into their own files and gave them functions to handle their own generation and conversion to Param varients
    • Added class CDUtils to seperate the data from card adding/editing funcitons
    • seperated ExtensionUtils into it's own file

v1.3.5

  • Compatablity patch for InscryptionAPI v1.10
  • Refactored code:
    • CardData has it's own file
    • Dicts has it's own file
    • EvolveData, TailData, and IceCubeData are now in their own file together
    • JLUtils was created to host utility functions like assignment helpers and validity checks

v1.3.3

  • updated error logging for user

v1.3.2

  • Added ability to edit existing cards with the use of "fieldsToEdit" with example card OP-ossum.json
  • Added better error logging for user

v1.2.1

  • Compatablity patch for InscryptionAPI v1.8

v1.2.0

  • Added validity check for TestDeck cards
  • Added functionality for:
    • EvolveParams via "evolve_evolutionName" & "evolve_turnsToEvolve"
    • TailParams via "tail_cardName" & "tail_tailLostPortrait"
    • IceCubeParams via "iceCube_creatureWithin"
  • Patched LoadScreenManager.LoadGameData and ChapterSelectMenu_OnChapterConfirmed to facilitate above implementation
  • Minor refactor of NewCard call

v1.1.1

  • Added ability to use strings for the enum values on a card
  • Added ability to add cards to starting deck using config file in order to test functionality

v1.0.1

  • Fixed issue with hard coded file paths

v1.0.0

  • Handles cards that don't use:
    • EvolveParams
    • TailParams
    • IceCubeParams