This mod allows you to easily add custom cards into the game by specifying them in JSON files.
To add your own cards, create a new folder inside BepInEx\plugins and create a new .cards.json file (like custompack.cards.json) inside that folder.
An example structure could look like this:
BepInEx
- plugins
- ChendraksCardPack
- ccp.cards.json
- Assets
- card1.png
- card2.png
EasyCards will scan for *.cards.json files in BepInEx\plugins subfolders.
Then start up the game and go to Stat -> Soul Cards. If everything went well, your cards should show up.
The full file format is specified below.
If your cards don't show up, please check BepInEx\LogOutput.log and BepInEx\ErrorLog.log for potential ideas as to why.
If there is no information in the logs, you can enable additional logs by opening BepInEx\config\EasyCards.cfg and setting
LogCards = true. After saving the file, restart the app and EasyCards will log A LOT of information about your cards and
maybe give you additional information.
If all else fails, feel free to swing by the Rogue: Genesia Discord and ask there.
CTRL + SHIFT + L, as opposed to having to enable it in the config.BREAKING CHANGES:
Tags element in each card needs to be empty OR be removed.Additional changes:
CardDropChance_* modifiers documentationOnTakeDamage triggerDamageTaken activation requirementEnemiesKilled activation requirementEffects sectionStats section in JSON files should now be called StatCards. Old files will still work.TexturePath wasn't set*.cards.json in BepInEx\plugins subfolders.{
// The name you want to show up in-game for your cards
// Optional, will default to EasyCards if not provided
"ModSource": "Your Mod Name Here",
"StatCards": [
{
// Internal name of your new card. This needs to be unique.
// Consider using a prefix for all your cards.
// Required
"Name": "CCP_Card1",
// The path to the image you want displayed on the card.
// This path is relative to where your json file is on your hard drive.
// Note: Most of the games card assets are 32x32 pixels.
// Required
"TexturePath": "CustomCardPack/Card1.png",
// The rarity of the card. See the list below for options.
// Required
"Rarity": "Epic",
// The tags the card has. See the list below for options.
// Optional
"CardTags": [ "Moon", "Sun" ],
// How likely is this card to drop?
// Required
"DropWeight": 0.10,
// How likely is the card to re-appear after you got it
// Required
"LevelUpWeight": 0.10,
// The maximum level of the card. If higher than 1, all stats will
// be multiplied by the level when you level up.
// Required
"MaxLevel": 1,
// A list of modifiers. See below for details
// Requiered (at least 1)
"Modifiers": [
{
"ModifierValue": 15,
"ModifierType": "Additional",
"Stat": "CriticalChance"
}
],
// Translations for the your cards name
// Required
"NameLocalization": {
"en": "My First Card"
},
// Translations for the your cards descriptions
// Optional
"DescriptionLocalization": {
"en": "My First Cards Description"
},
// For this card to show up, ANY of the below is required
// Optional
"RequiresAny": {
"Cards": [{"Name": "Egg", "Level": 1}],
"Stats": {
"StatRequirements": [{"Name": "Damage", "Value": 8999}],
"RequirementType": "Min"
}
},
// For this card to show up, ALL of the below is required.
// The format is the same as `RequiresAny`
// Optional
"RequiresAll": {},
// The names of cards you want to banish when your card is selected.
// Can be any custom card or card that is included with the game.
// Only blocks them from showing up again, if you have them, they will
// stay in your inventory.
// Optional
"BanishesCardsByName": [ "Katana", "VoidSpirit" ],
// The modifier names that you want this card to banish.
// This example banishes every card that modifies `DamageMitigation`
// Optional
"BanishesCardsWithStatsOfType": [ "DamageMitigation" ],
// When you select this card, remove all listed cards from your inventory
// Optional
"RemovesCards": [ "Katana", "VoidSpirit" ],
// Allows you to disable the card in a Rogs or Survivors mode.
// Optional
"DisabledInMode": "Rogs",
"Effects": [
{
// The internal name for your effect. It's not used for anything outside of logging.
// If you don't provide one, it will be generated.
// Optional
"Name": "MyAwesomeEffect",
// The type of the effect. See below for all possible values.
// Required
"Type": "OneTime",
// What is required for the effect to be enabled?
// Optional, defaults to None
"ActivationRequirement": "None",
// The action to be taken when the effect is applied.
// Required
"Action": "HealAmount",
// What needs to happen for the effect to apply? The effect needs to be enabled for this.
// Required for some Types
"Trigger": "OnEliteKill",
// Allows you to configure certain aspects of an effect.
// Required
"Properties": {
// The exact amount for Action.
// Example: [Action = HealAmount, Amount = 10] would heal you for 10 when the effect is triggered.
// Required for some Actions.
"Amount": 1.0,
// The percentage for the effects Action.
// Example: [Action = HealPercentage, Percentage = 10] would heal you for 10% of your max hp
// when the effect is triggered.
// Required for [Action = HealPercentage]
"Percentage": 12,
// The duration of the effect. The effect will be disabled after [Duration] expires.
// Specified in seconds. Fractions of a second can be defined as 0.1 for 100ms.
// Required for [Type = Duration]
"Duration": 12,
// Amount of time between effect activations.
// Example: [Action = HealAmount, Amount = 20, Interval = 30] -> Heal you for 20 hp every 30s.
// Specified in seconds. Fractions of a second can be defined as 0.1 for 100ms.
// Required for [Type = Interval]
"Interval": 30
}
}
]
}
]
}
The rarity of the card.
Possible values: Tainted, Normal, Uncommon , Rare, Epic, Heroic, Ascended, Synergy, Evolution
Tags for your card. Think of them as grouping them.
Possible values: None, Moon, Sun, Fire, Wind, Hunt, Wild, Void, Dark, Metal
Represents the mode this card will be disabled in.
Possible values: Rogs, Survivors
Specifies modifiers that the card applies to your stats.
Example:
{
"ModifierValue": 15,
// Specifies HOW the `ModifierValue` is applied
"ModifierType": "Additional",
// Specifies WHICH stat this modifier applies to
"Stat": "CriticalChance"
}
A stat that your card modifies.
Possible values: MaxHealth, HealthRegen, Defence, DamageMitigation, XPMultiplier, PickUpDistance, AdditionalProjectile, ProjectilePiercing, ProjectileLifeTime, ProjectileSpeed, ProjectileSize, AreaSize, KnockBack, MoveSpeed, AttackCoolDown, AttackDelay, Damage, CriticalChance, CriticalMultiplier, DashSpeed, DashDuration, DashDelay, DashCoolDown, DashCharge, DashChargePerCoolDown, GoldMultiplier, SoulCoinMultiplier, DefencePiercing, Corruption, AnachronisticDurationMultiplier, CardDropChance_Tainted, CardDropChance_Normal, CardDropChance_Uncommon, CardDropChance_Rare, CardDropChance_Epic, CardDropChance_Heroic, CardDropChance_Ascended, CardDropChance_Synergy, CardDropChance_Evolution, CardDropChance_Moon, CardDropChance_Sun, CardDropChance_Fire, CardDropChance_Wind, CardDropChance_Hunt, CardDropChance_Wild, CardDropChance_Void, CardDropChance_Dark, CardDropChance_Metal
How does your card modify a stat?
Possible values: Additional, Multiplier, Compound
NOTE: For most multiplication cases, you will want to use Compound, especially for negative multiplisers.
Example
"RequiresAny": {
"Cards": [
{"Name": "Card1", "Level": 1},
{"Name": "Card2", "Level": 3},
],
"Stats": {
"StatRequirements": [
{"Name": "Damage", "Value": 8999},
{"Name": "Corruption", "Value": 10},
],
"RequirementType": "Min"
}
},
A list of cards that are required. Each entry looks like this:
{"Name": "Card1", "Level": 2},
Name is the internal name of the card, Level is the minimum level.
So in the above example, the requirement is fulfilled if you have Card1 at Level 2 in your inventory.
Stat requirements are more complex. An entry looks like this:
"Stats": {
"StatRequirements": [
{"Name": "Damage", "Value": 8999},
{"Name": "Corruption", "Value": 10},
],
"RequirementType": "Min"
}
StatRequirements contains a list of stats Stat names and values to fulfill. RequirementType specifies if the stat requirements are Min(imums) or Max(imums).
That means, the above example translates to:
For this card to show up, the player must have AT LEAST 8999 Damage and AT LEAST 10 Corruption.
If we were to change the RequirementType to Max, it would change to For this card to show up, the player must have at LESS THAN 8999 Damage and LESS THAN 10 Corruption.
This is a list of effects that are applied to the card.
An optional name for the effect. This is only used for debug logs and will be auto-generated if not provided.
Describes the type of this effect.
Options:
OneTime: The effect is executed once, then disabled againDuration: After activation, the effect is active for a certain amount of time, then disables itself. This type requires a Trigger in PropertiesInterval: After activation, the effect repeats on an intervalTrigger: The effect is activated when a certain event happensWhat needs to happen for this effect to become active?
Default: None
Options:
None: The effect is always activeStageStart: The effect will activate at the start of a stage in Rogs Mode. In Survival, this is the same as NoneStageEnd: The effect will trigger at the end of a stage in Rogs Mode. Can not trigger in Survival. !!! NOT IMPLEMENTED YET !!!EnemiesKilled: The effect will activate when a certain amount of enemies was killed.DamageTaken: The effect will activate after you have taken a certain amount of damage from enemies. The required amount is defined in ActivationRequirementProperties.TotalDamageTakenCertain ActivationRequirements have parameters, which are defined here.
Options:
TotalDamageTaken: For ActivationRequirement.DamageTake: Specifies the amount of damage you need to take before the effect activates.EnemiesKilled: For ActivationRequirement.EnemiesKilled: Specifies the number of enemies you need to kill before the effect activates.Describes what needs to happen for the effect to be applied.
Options:
OnStageStart: Effect applied at the start of a stage in Rogs mode or immediately in Survivors mode.OnStageEnd: Effect applies at the end of a stage in Rogs mode and never in Survivors mode. !!! NOT IMPLEMENTED YET !!!OnKill: Effect applies when any enemy is killed (that includes Elites and Bosses)OnEliteKill: Effect applies ONLY when an elite enemy is killed.OnBossKill: Effect applies ONLY when a boss enemy is killed.OnDash: Effect applies when you dashOnDeath: Effect applies when you die. NOTE: Attempting to heal yourself with this trigger will NOT revive youOnTakeDamage: Effect applies when you take damage from any source.Describes what this effect will do
Options:
AddGold: Gives you the amount of gold specified in Properties.AmountAddBanishes: Gives you the amount of banishes specified in Properties.AmountAddRerolls: Gives you the amount of rerolls specified in Properties.AmountAddRarityRerolls: Gives you the amount of rarity rerolls specified in Properties.AmountHealAmount: Heals you by the exact amount specified in Properties.AmountHealPercentage: Heals you by the percentage of your max health specified in Properties.PercentageContains properties that are required for certain other aspects of an effect.
"Properties": {
"Amount": 12000,
"Percentage": 95.5,
"Duration": 30,
"Interval": 30,
}
Options:
Amount: An exact amount of something.
Number [1, 2.0, 1.222, etc]AddGold, AddBanishes, AddRerolls, AddRarityRerolls, HealAmountPercentage: An percentage of something.
Number [1, 2.0, 1.222, etc]HealPercentageDuration: A duration in seconds.
Number [1, 2.0, 1.222, etc]DurationInterval: An interval in seconds.
Number [1, 2.0, 1.222, etc]IntervalNOTE: This functionality has been deprecated and now does nothing!
Examples for effect cards and a description of what they do can be found on Github.