Erannorth Reborn

Erannorth Reborn

Not enough ratings
Modding Erannorth Reborn
By Raven
Hello everyone! Erannorth Reborn is build with the intention to be moddable from Day 1, and so you can alter many aspects of the game to your liking. You can add new artworks for the PC, create new Action Cards & Enemies, edit Classes & Races, change the Skill Trees and even create brand new Classes & Races. Furthermore you can do that without any programming knowledge, simply by editing text files. Let's see how.

 
Rate  
Favorite
Favorited
Unfavorite
Custom PC Avatars
To unlock the Custom Avatar slider all you need to do is to place some Male & Female Artworks in two folders located in Erannorth's Steam installation folder.

I have Steam installed in my E:\Documents so the path looks something like this for me:

E:\Documents\SteamLibrary\steamapps\common\Erannorth Reborn\Erannorth Reborn_Data\StreamingAssets\Content\Ragdolls

It doesn't matter how you name the files, or how many (within reason) artworks you put there, as long as both the Male & the Female subfolders there have at least 1 PNG image.

The expected dimensions are: 231x575 pixels. Both the Character Card & Character Sheet ragdoll is generated from a single file.
Editing Action Cards
Action Databases are located in E:\Documents\SteamLibrary\steamapps\common\Erannorth Reborn\Erannorth Reborn_Data\StreamingAssets\Content\Actions

Ignore the weird file extension and open the file with any text editor, but make sure to backup the original files first as any typo in the structure there will make the file unreadable and the game unplayable. The file structure, spaces and commas even, have to be followed precisely.

Actions are build by combining separated effects. Additionally some other fields are also required for everything to work as intended. Two lines are used for the declaration:

Example 1:
Apprentice Staff (An), Animist
Damage:1, Defend:1, Persistent:1, Slot:0, Actions:1, Tier:1, Element:Bludgeoning


Example 2:
Animal Instinct, Lycanthrope
CountAsPrimal:1, Echo:2, Defend:6, Retribution:2, Actions:3, Tier:2, Element:Slashing



The first line contains the Action name and the Archetype or Race is intended for.
The second contains the effects of the action. As long as the action has a unique name the game will read it and add it to the corresponding Archetype or Race.

These actions use internal artwork resources that match the card name. So an Animal Instinct artwork exists in the game resources and is used for the card with the same name. Meaning you can freely edit its effects but unless you provide a new artwork you have to keep the card name intact.

So now that we know how to edit Actions, lets see how we can create new ones!


Creating new Actions from scratch
To use custom Artworks in a Card, use the parameter UserArtwork:1 when declaring the card, and place a [Card Name].png file in the folder:

E:\Documents\SteamLibrary\steamapps\common\Erannorth Reborn\Erannorth Reborn_Data\StreamingAssets\Content\CustomArtworks\Actions

This will load your .png file instead and can also be used to override artworks or simply create new graphic sets for custom cards. Expected dimensions are 256x256 or 512x512.

i.e To create a New Card "Fireball II" place the [Fireball II.png] in Cards, and declare the Fireball II card in Actions/CardDB.Mystic.tdb

Fireball II, Mystic
Damage:10, Actions:4, Tier:5, Element:Fire, UserArtwork:1


The structure needs to be precise:
Cardname,[space]Archetype
Effect:Value,[space]Effect:Value,[space]Effect:Value

etc.

Of course, editing the original files may not be such a good idea, i mean what will happen when you update the game? I suspect your changes will be lost, that's where the Modloader.conf comes in play.
ModLoader.conf & ModLoaderUser.conf
The ModLoader is responsible for loading Card & Enemy databases, as well as the Core & Custom Races and Classes into Erannorth Reborn.

Its located in E:\Documents\SteamLibrary\steamapps\common\Erannorth Reborn\Erannorth Reborn_Data\StreamingAssets\Content

Here is how it looks:


>> Cards
CardDB.Generic.tdb
CardDB.Loot.tdb
CardDB.Mystic.tdb
CardDB.Mercenary.tdb
CardDB.Hunter.tdb
CardDB.Shadow.tdb
CardDB.Necromancer.tdb
CardDB.Exorcist.tdb
CardDB.Witch.tdb
CardDB.Animist.tdb
CardDB.Human.tdb
CardDB.Vampire.tdb
CardDB.Lycanthrope.tdb
CardDB.Demon.tdb
>> Enemies
EnemyDB.Core.tdb
>> Core Races
Human:0
Vampire:50
Lycanthrope:50
Demon:50
>> Core Classes
Mercenary:0
Shadow:25
Mystic:25
Hunter:25
Animist:25
Necromancer:25
Exorcist:25
Witch:25


Let's leave the Races & Classes part till the end of this guide. For now all you need to know, is that to add your own card & enemy set in the game, you can simply add them in this file.
The problem by editing this file, is that I may update its structure down the road, so to make sure that no update will mess with your changes its recommended to create a file named ModLoaderUser.conf and add your modifications there. In Example:

>> Cards
MyCustomCardSet.tdb
>> Enemies
MyCustomEnemySet.tdb


(Don't forget a space after the >>)

Actions .tdb files are expected here: E:\Documents\SteamLibrary\steamapps\common\Erannorth Reborn\Erannorth Reborn_Data\StreamingAssets\Content\Actions

and Enemy.tdb files are expected here:
E:\Documents\SteamLibrary\steamapps\common\Erannorth Reborn\Erannorth Reborn_Data\StreamingAssets\Content\Encounter
Action Effects - Part 1
As we already discussed, to create new actions you combine pre-existing effects in new ways.

Lets see them all in detail:

Tier:x
A number 1 to 5. Declares action Tier. This in turn determines, how many Upgrades the card has and when we unlock it. i.e Tier:2

Persistent:1
A flag to describe that the action is an Equipment. Equipment is handled differently than normal actions: it needs to be equipped and can be used once per turn.
When declaring equipment is also obligatory to declare its Slot: 0 for Main and 1 for Offhand.

In Example:
Silver Dagger, Hunter
Damage:1, Silver:2, Persistent:1, Slot:0, Actions:1, Tier:1, Element:Piercing


Unique:1
A flag that can be used with summons, and specify that there can be only one such summon, and that the said summon never expires. (It can still die from damage)

In Example Hunter's Wolf:
Wolf Companion, Hunter
Unique:1, Uses:1, TotalUses:1, Summon:Cardname, Power:3, Health:6, Lifespan:15, Actions:0, Element:Piercing


Primal:1 & CountAsPrimal:1
These flags are used to describe that an Action is Primal and deals Damage or counts as Primal.
While in a Wildform every non-Primal Action is discarded from the player's hand. Additionally Primal deals +1 damage for every other Primal Action that was used before it.

In Example:
Feral Strike, Lycanthrope
Primal:3, Bleed:1, Actions:2, Tier:1, Element:Slashing

First Feral Strike will deal 3 damage, Second in same turn 4 etc.

In Example:
Howl at the Moon, Lycanthrope
CountAsPrimal:1, Amplify:2, ExtendAlly:2, Actions:2, Tier:3, Element:Slashing

Howl at the Moon will not get discarded when the player is Wildshaped, all his other non-Primal actions will.

Uses:x & TotalUses:x
Action is permanently removed from deck once used x times.

in Example:
Fire Oil, Hunter
Echo:2, Imbue:Fire, Amplify:2, Uses:2, TotalUses:2, Actions:2, Tier:2, Element:Fire


Fire oil can be used only twice. So I draw it, i use it, goes to discard pile. Drawn all my cards, draw Fire Oil again, use it a second time. Poof! its gone from Deck.

Element:[Damage Type]
The Action will deal this type of damage. Damage types in Erannorth Reborn are: Slashing, Bludgeoning, Piercing, Fire, Water, Air, Earth, Light, Dark, Astral & Poison. in Example the Fire Oil above will deal Fire damage.

Split:[Damage Type]
Half of the Action Damage is converted to the new damage type.

In Example:
Cat Claws, Lycanthrope
Primal:1, Damage:3, Bleed:1, Persistent:1, Slot:0, Actions:3, Tier:1, Element:Slashing, Split:Piercing


Half damage counts as Slashing & Half damage counts as Piercing (is reduced by a different enemy resistance)

Summon:S
To define a summon, you either use a predefined type or use Cardname as value.
These are the values S accepts:

  • Skeleton
  • Zombie
  • Maggots
  • Boar
  • Wolf
  • Bear
  • Sabrecat
  • Lion
  • Spirit
  • Witch
  • Lesser Demon
  • Lesser Vampire
  • Lesser Shadow
  • Werewolf
  • Cardname

Additionally a summons always needs to have a Power, Health, Lifespan (maybe Unique) and optionally a quantity declared as Qty.

in Example:
Beta, Lycanthrope
Unique:1, CountAsPrimal:1, Summon:Wolf, Power:8, Health:16, Lifespan:5, Actions:4, Tier:4, Element:Earth


Beta is a Unique Summon, that never expires (even though Lifespan still needs to also exist there) with Damage threshold 4 to 8 & Health 16.

Call the Pack, Lycanthrope
CountAsPrimal:1, Summon:Werewolf, Qty:3, Power:6, Health:12, Lifespan:5, Actions:9, Tier:5, Element:Earth


Call the Pack, summons 3x Werewolves each with Power 6 & 12 Health for 5 rounds.

If a summon is defined incorrectly the card will instead display: [Error] Invalid Summon Template! so you can see that something is wrong and fix it ;)

Damage:x
Deal x damage to Target. [of type defined by Element]

Damage is increased by Player Proficiencies & Card Evolution so for example:
Silver Dagger, Hunter
Damage:1, Silver:2, Persistent:1, Slot:0, Actions:1, Tier:1, Element:Piercing


Deals (1 + [Player's Piercing Proficiency] / 2) to (1 + [Player's Piercing Proficiency] ) Damage.

Imbue:[Damage Type]
All your next Actions gain Split:[Damage Type]

in Example:
Holy Water, Hunter
Imbue:Light, Amplify:1, Uses:5, TotalUses:5, Actions:2, Tier:2, Element:Light


Half of the Damage of all following actions (this turn) deal 50% their normal damage type, and 50% light damage.

ExtendAllies:x & ExtendAlly:x
Increase the lifespan of all allies or of target ally by x.

StrengthenAllies:x & StrengthenAlly:x
Increase the power of all allies or of target ally by x.

FortifyAllies:x & FortifyAlly:x
Increase the health of all allies or of target ally by x.

SacrificeAlly:x
Destroy Target Ally, then gain (or lose) life equal to its remaining Health +/- x.

In Example:
Lunar Madness, Lycanthrope
CountAsPrimal:1, Echo:4, FortifyAlly:1, StrengthenAlly:1, ExtendAlly:-1, Actions:4, Tier:3, Element:Earth


For 4 turns or till expires, Target Ally gets +1 Health, +1 Power & -1 Lifespan.

Intense:x
Deal x unresistable damage.

Focus:x
Draw x cards from your deck (or up to hand limit)

Invoke:x
Create and Draw x new Random card of the same Archetype or Race as this card. (or up to hand limit)

In example:
Moondance, Witch
Invoke:2, Summon:Witch, Power:3, Health:6, Lifespan:3, Actions:3, Tier:2, Element:Astral


Moondance will create up to 2 Witch Cards, which you will draw in your hand, and then summon a Witch with Power 3, Health 6 & Lifespan 3.

Enlightenment:x
Player will gain +x XP.

Echo:x
While Target exists, if this Effect is active: reapply all other Action effects on Target for x turns.

In Example:
Simulacrum, Witch
Echo:2, Defend:6, Focus:1, Actions:4, Tier:3, Element:Astral


This turn, and the two next turns, gain Defend +6 & Draw 1 extra card.

Replicate:x%
there is x% chance to receive a <i>temporary copy</i> of this Action after use it. Each time x is permanently reduced by 1.

in Example:
Foresight, Witch
Focus:2, Replicate:35, Actions:2, Tier:1, Element:Astral


You draw up 2 Cards and then you may get a free copy of Foresight back.

Drain:x
Non Undead Target loses x life and you gain x life.

Drain Soul:x
If Target dies from this Action restore x HP and gain (a fixed) Empower of +2.

Doom:x
If Target dies in the next x turns, they reanimate as a Zombie Ally, (as per the Reanimate Necromancer Action.)

Sneak Attack:x
Multiply your damage by x, if you are concealed. After attacking your concealment is lost.

Silver:x
Multiply your damage by x, if your target is Vampire, Lycanthrope or Monster.

Blessed:x
Deal +x damage, if the target is Undead, Spirit or Demon

Banish:x
Destroy Target Spirit or Demon with current HP less than x

DestroyUndead:x
Destroy Target Undead with current HP less than x

Chain:x%
% chance to damage an additional target. Or the same target.

Amplify:x
Deal +x more [Damage Type defined by Element] or x less damage if x is negative.

In Example:
Unclad, Witch
Echo:2, Defend:-4, Amplify:2, Focus:1, Actions:2, Tier:1, Element:Astral


This and in the next 2 turns, lose 4 Defend, but you deal +2 Astral Damage and Draw an extra card.

Wildshape:x
You either grow claws if non Lycanthrope, or assume your hybrid form if Lycanthrope for x rounds. During those turns, you keep only the primal actions your draw, and you gain 2 claw attack cards.

(continues in part 2)
Action Effects - Part 2
Desecrate:x & Consecrate x
Create a circle of Darkness or Light for x rounds that deal [Tier] damage or heal [Tier] hp.

In Example:
Exhume, Necromancer
Desecrate:2, Doom:2, Actions:1, Tier:2, Element:Dark


Create a circle of darkness that last 2 rounds. During those Undead heal 2 hp, living lose 2 hp. If your originating target dies they reanimate thanks to the Doom effect.

Defend:x
You absorb x damage or receive x damage more from the next damage source.

Stun:x
While Stunned, Target can't Act (Undead & Golems are immune to this Effect)

Entangle:x
While Entagled, Target has 50% chance to lose their Turn.

Bewitch:x
While Bewitched, Target attacks your Enemies or inflicts self harm (Undead & Golems are immune to this Effect)

Weaken:x
While Weakened, Target's Damage is reduced by 1 per counter (down to 1).

Vulnerable:x
While Vulnerable, Target receives +1 extra Damage per counter.

Freeze:x
While Frozen, Target can't attack & Loses 1 HP per counter.

Bleed:x
While Bleeding, Target Loses 1 HP per counter (Undead & Golems are immune to this Effect).

Empower:x
Improve all Action effects in relation to x.

Poison:x
Deal x damage of [Card Damage Type] and Weaken enemy by x/2.

Kill:x
Target has x% chance per missing HP to instantly die.

AoE:x
Deal x Damage of [Card Damage Type] to all enemies

Double, Triple & Quad: x%
x% chance to deal double, triple or quad damage

Retribution:x
Enemies attacking you this turn receive x unresistable damage

Healing:x
Target (You or Ally) gains x life, or you lose x life if x is negative.

Meditate:x
You restore or lose x AP.

Concealment:x%
You have x% chance to avoid attacks this round. (Having concealment can also trigger sneak attacks.)

Fatigue:x
Fatigue increases or reduces your Fatigue by x. (Actions cost increase by 1 for every fatigue point, and once fatigued, each action increases fatigue by +1)

Festering x:
If the Target is Bleeding, Festering Wound deals x Intense Damage to them.

Resist[DamageType] x
Give the Caster resistance to a specific DamageType x, till the end of turn
i.e. ResistSlashing:2, ResistPiercing:-2 will give +2 Slashing Resistance & -2 Piercing Resistance till the beginning of your next turn. (Effect debuffs after all enemies attack).


MulticastAll:1
  • Action will Clone itself, then target & affect every enemy separately. (Replicate, Echo & Multicast effects aren't copied.)
  • Exact wording is: Multicast (All). & detailed description: "This Action Targets & Affects (separately) all Enemies."

Multicast:x
  • Action will Clone itself, then target & affect the x first enemies separately. (Replicate, Echo & Multicast effects aren't copied.)
  • Exact wording is: Multicast (x). & detailed description: "This Action Targets & Affects (separately) the first x Enemies."

Notes for Modders on Multicast:

  • Multicast Actions have effect only if the resolved target is an enemy. Players will receive any beneficial/harmful effects automatically each time the Multicast action clones. i.e [Multicast:3, Damage:3, Defend:3] can damage up to 3 targets for 3+ Damage & the player will receive up to +9 Defend (Adjust beneficial effects accordingly).
  • Multicast Cloned Actions don't cost any additional AP to the player. (Adjust the initial cost accordingly.)
  • Multicast Actions will gain an additional +1 XP each time they clone. i.e 3 XP for 2 Targets etc leveling up much faster, but the Multicast effect itself won't increase when a card levels up.

Additions in Dev. Build 0192

Synergy[Effect]:x
  • The next action you play this turn gains Effect:x. Effect can be any keyword except Echo, and will resolve according next action's evolution / empowerment.
  • Value x displays with a *, because we are not in a position to know the next action & how it will evolve this value.
  • Example1: SynergyDefend:3, next action gains Defend:3, but if next action is Level 2, this value will receive a +2 bonus giving you Defend +5.
  • Example2: SynergyRetribution:-3, next action gains Retribution:-3, but if next action is Level 1, this value will receive a +1 bonus giving you Retribution:-2.
  • The bonus effect is gained even if it didn't exist before in the action, if it does it modifies the existing effect by x.
  • More than one instance of synergy can be present in an action:
  • Example3: SynergyFocus:1, SynergyMeditate:-2, next action gets both effects: draw 1* card and lose -2* AP.

Additions in Dev. Build 0193

  • Discard:x => Discard up to x Cards at Random.
  • Explode:x => If target dies from this Action, each other enemy suffers x intense damage.
  • Greed:x => Target suffers +x damage + 1 for each card in your hand.
  • Gluttony:x => You (or ally) restore +x HP + 1 for each card in your hand
  • Wrath:x => Target suffers +x + Your retribution damage. Debuff Retribution.
  • Sloth:x => Target suffers +x damage + 2 for each card in your hand. Discard your Hand.
  • Envy:x => Target suffers +x damage +1 for every Hit Point you are missing.
  • Lust:x => Bewitched Enemies suffer x Intense Damage + 5 for each Bewitched enemy damaged before them.
  • Pride:x => Enemies with Power less/equal than x lose HP equal to their Power (Power = Max Damage)
  • Sacrifice:x => Lose x HP. Target suffers +2x Damage.
  • ReactivateAlly:1 => Reactivate Target Ally
  • Merge:1 => Discard all Actions with the same name. Gain +3 Empower for each Action discarded this way.
  • Spellcraft[Cardname]:x => Create & Draw x [Cardname]
  • EnemyBane[Race]:x => If Target is of [Race] deal +x Intense Damage to them.
Action Effects - Part 3
New Action Keywords (EoT Triggers) in Build 0215

EoT Triggers: Their effect triggers, if the card having this effect is still in your hand as you end your turn. All EoT Triggers will trigger, immediately after the custom Discard phase & before any Echo Actions trigger in the following order:

Cursed:x, If a card with this effect is in your Hand when you End your Turn: Lose x HP & Discard up to x Card(s) at Random. If more than one Cursed cards are in Hand, their Discard values will stack and Discard will trigger after all End of Turn triggers have been processed.

Mutate[Card Name]:x, If a card with this effect is in your Hand when you End your Turn: Discard it, then Create and Draw x [Card Name] copies. Mutate will trigger after a custom Discard phase (if any), but before any Discards caused due to Cursed cards.

Unravel:x, If a card with this effect is in your Hand when you End your Turn: Discard it. You gain (or lose) x AP.

Fleeting:1, If a card with this effect is in your Hand when you End your Turn: Discard all cards with the same name from your Hand & Drawpile.

Cards with Cursed, Unravel or Fleeting cannot be manually discarded (via Drag & Drop to Backpack) a message will display instead in the Combat Log: "You can't choose to discard cards with the 'Cursed', 'Unravel' or 'Fleeting' effects."

Note to Modders:

There isn't much point using EoT triggers in Equipment that doesn't go to your hand (like Armors & Accessories)

You can use EoT triggers in Weapon & Offhand Equipment, but keep in mind that they won't discard as part of the EoT Trigger effect, and that they automatically return at the player's hand every turn.

New Keyword Modifier: Teamwork[Effect]:x

  • Teamwork is a more demanding version of Synergy that also requires the presence of an active ally and needs to actually target an ally to work
  • Teamwork [Effect] x: Exhaust an Active Ally. If you do, the next Action you play this turn gains Synergy [Effect] x + Ally Level.
  • Teamwork effect will only trigger if an active ally is targeted. The ally will then get exhausted and the Synergy Modification will become active.
  • All Allies can gain xp & level up, but it's very tricky for non-unique allies to actually do so due to their temporary nature

Note to Modders: [Effect] can be any numerical based keyword except 'Synergy' & 'Echo'


New Action Keywords in 0216
  • Fury:x, Create and use on Target x individual copies of this Action. Each copy triggers separately and in order, but you pay the Action cost only once.
    • The Fury effect will only trigger when targeting an Enemy and as long as this enemy is still alive
  • Chaotic:x, Deals x/2 to x [Card Type] Damage to a Random Enemy (Including Flying Enemies)
  • Notes to Modders:
    • Chaotic deals a [Card Type] Damage as such will benefit from Amplify, Affinity or any Perks modifying those
    • Chaotic can harm Flying Enemies even if the Card isn't Ranged
    • Modifications in the 'Damage Effect' (like from Bellicose or Cautious Perks) only modify the 'Damage Effect', so if you want to include 'Chaotic' you need to explicitly do so.
    • All vanilla perks that Modify Damage have been altered to also Modify Chaotic (to avoid confusion)
    • i.e Bellicose is now defined: ModifyEffectDamage:1, ModifyEffectChaotic:1, ModifyEffectDefend:-1
    • So in all cases any vanilla card with both Damage & Chaotic should display and deal the exact same range of damage
    • If both Damage & Chaotic effect is present in the same card, both will split or benefit from Double, Triple, Quad & both will benefit from Amplify Bonus & reduce it.
    • The Chaotic effect doesn't require an explicit target, so won't mark cards having it as 'Enemy'. It can be part of self, ally or armor cards and still harm the enemies similar to Pride & Lust.
  • Dispel[Status]:x, Target loses up to x [Status] counters.
    • In order to Dispel a status your [Level + Card Level + Empower] must be higher/equal than [Enemy Level + 3]
    • Notes to Modders: Not all effects really make sense to dispel, especially those you inflicted, but still you can use this keyword to dispel any status except "Dispel"
    • There is a list with all the available statuses in 0216 build below

Conditional Action Triggers
  • A bonus effect can be added to the action depending on the target enemy status
  • If the Target has +x [Status] counters, this Action gains [Effect] y.
  • i.e If the Target has +2 Vulnerable counters, this Action gains Bleed 1.
  • i.e If the Target has +3 Immobilized counters, this Action gains Kill 100.
  • Notes to Modders:
    • The Triggers are build to work for any present and future Status & Keyword. There is a simple two step declaration:
    • OnEnemyStatus[Status]:x, AddEffect[Effect]:y
    • Only one such pair can be added in a single action
    • ie. OnEnemyStatusVulnerable:2, AddEffectBleed:1, Actions:1, Tier:1, Element:Piercing
    • ie. OnEnemyStatusImmobilized:1, AddEffectVulnerable:2, Actions:1, Tier:1, Element:Piercing
    • AddEffect accepts any numerical keyword that isn't already composite keyword. i.e You can't do AddEffectSynergyBleed:1, as SynergyBleed is already a composite keyword.
    • For now the Added effect triggers individually so you can't add an effect that acts as a modifier ('Double' or 'Chain' for example both need a Damage source). But you can use any stand alone effect.
    • OnEnemyStatus accepts any enemy status that uses counters to apply: Immobilized, Entangled, Frozen, Bleeding, Bewitched, Weaken, Vulnerable, Doom, Poison, Defensive Stance, Spiked Armor, Counter Attack, Warcry, Rage, Empower, Healing, Hex, Concealment, Incorporeal, Regenerate, Gallop, Flying, Feed, Hybrid Form, Animal Ally, Illusory Copy, Dispel

Contingency Action Triggers - EA Build 0217
  • If the Caster has more (or less) [Status] than x, this Action gains [Effect] y
  • Notes to Modders:
    • Similar to Conditional Action Triggers but they instead trigger based on the PC HP, AP & Level values. There is a simple two step declaration:
    • OnCasterStatus[Status]:[x], ContingencyEffect[Effect]:[y]
    • Caster Status can be HPLess, HPMore, HPOverHalf, HPBelowHalf, APLess, APMore, APOverHalf, APBelowHalf, LevelLess, LevelMore
    • Caster Status can be [Attribute]More or [Attribute]Less ie. CharismaMore, ResilienceLess etc.
    • Less/Below is true only if the checked value is less, while More/Over if the checked value is greater or equal
    • i.e OnCasterStatusHPOverHalf:1, ContingencyEffectSacrifice:5 will add a Sacrifice Effect if Player's HP >= 50%
    • i.e OnCasterStatusCharismaMore:20, ContingencyEffectLust:5 will add a Lust Effect if Player's Charisma is more than 20
    • Only one contingency pair can be present in the card
    • Unlike Conditional Action Triggers that only target Enemies, Contingency can additionally target the caster or an ally
    • A (single) Conditional & a (single) Contingency Trigger can both be present in the same card

New DoT Counter Types & Action Effects in EA Build 0223
  • Venom x: [Gives Envenomed counters] Target loses 3 HP per Envenomed counter. (Non-Immune Enemies have a 25% chance to resist this effect.)
  • Burn x: [Gives Burning counters] Target loses 5 HP per Burning counter. (Non-Immune Enemies have a 25% chance to resist this effect.)
  • AdjustStatus[Counter Type] x: All counters of the chosen type in Target increase or decrease by x. If the Target doesn't have any counters of the chosen type, this effect is ignored.
  • i.e AdjustStatusVulnerable:3, if the Target has any Vulnerable counter they increase by +3. if they previously had 1 they now have 4 etc.
Action Effects - Part 4
New Action Effects & Properties in EA Build 0224
  • New Action Property: ExcludeFromRandomLoot:1, can be used to exclude an Action from Random Drops & Merchants i.e to make it a unique quest reward or craftable only through another card, event etc.
  • New Action Effect (to use as a Summon Property)
    • AllyAbility[Ability]:x, Override the Ally Special Command (Defend + Retribution), with this [Ability]
    • Unlike the Default Command (Defend + Retribution), this custom special ability don't cost anything to your ally, but using it will deactivate them for the turn
    • [Ability] can be any Card Effect. A temporary card will be created with this effect and target the first enemy. Player still receives any positive benefits.
    • i.e AllyAbilityDamage:3, will create a 'card' with a base Damage Effect of 3 of the Ally's element. Then the Player's Bonuses in that element will apply and will use this 'card' automatically to the first enemy
    • [Ability] can be a Card Name. A temporary card will be created with spellcraft [card name] and target the first enemy. Player will then receive the [card name] copy in hand.
    • i.e AllyAbilityCharge:1, will create a "Charge" Card in player's hand
    • The created card copy aside from [Ability] will also inherit any active synergies. i.e A synergy damage while activating a heal ability, will both heal the player & harm the first enemy.
    • The first enemy (if exists) is the prefered target to avoid harming the player. However if there are no enemies in the battlefield the player will be targeted instead despite any harmful synergies.

New Action Effects & Properties in EA Build 0229
  • Singleton:1, You can only have one copy of this card in your Deck.
  • Reaction:1, If this card is still in your Hand after playing a card, Discard it.
  • While Fleeting cards last till the end of turn, Reaction cards can survive the end of turn and will last till you play a card.
  • If a player has 2 or more Reaction cards in hand they can only play just 1.
  • UnsummonAlly:1, Unsummon Target Ally (need to target an ally)
  • OnDrawCreate[Card Name]:x, Upon Drawing a Card with this effect, Create and Draw x [Card Name] copies
  • Unlike Spellcraft[Card Name] this effect is resolved instantly as the card gets drawn (whether or not the player ends up playing the card having this effect is irrelevant)
  • To prevent flooding hands with infinite copies:
  • Copies created from OnDrawCreate that create themselves, won't replicate further.
  • i.e a Card named "Replica", has OnDrawCreateReplica:2. Upon Drawing it you will create two copies of the Card Replica, but the replication will stop there.
  • i.e a Card named Replica, has both OnDrawCreateReplica:1 & SpellcraftReplica:1.
  • Upon Drawing it you will create 1 copy of the Card Replica, and the replication will stop there.
  • Upon Playing it you will Craft a Replica copy that will cause the OnDrawEffect to trigger, giving an additional copy of Replica. Replication will stop there.
  • Additionally there is now a hard cap size in Hand of 20. If the player reaches that cap, no more cards will be created or drawn (whether their equipment, actions or copies) till they discard some of their cards.
  • Perks that increase Spellcraft effect should also increase the OnDrawCreate effect (By manually adding the bonus in them i.e Coven Rituals: ModifyEffectSpellcraftCoven Witch:1, ModifyEffectOnDrawCreateCoven Witch:1, etc.)
  • OnDrawCastSelf[Card Name]:x, Upon Drawing a Card with this effect, Create and Use on Self x [Card Name] copies
  • OnDrawCastFirstEnemy[Card Name]:x, Upon Drawing a Card with this effect, Create and Use on First Enemy x [Card Name] copies
  • Text space aside, any number of OnDraw effects can be present in a single card
  • SynergyActions:x, can now modify the AP cost of the next action & will display as "Your next Action costs +/-x AP.", for better clarity
  • AllyAbility, can now take a Synergy as ability by using the * at the end of the definition. i.e AllyAbilityFocus*:1, will translate to SynergyFocus:1 instead of Focus:1

New Action Effects & Properties in EA Build 0230
  • ReUseArtwork:[string], Instead of using the Action's name for the artwork, you can reuse a vanilla or a custom one in your actions: i.e ReUseArtwork:Broadsword, will set this cards artwork to 'Broadsword.png'
  • ie. UserArtwork:1, ReUseArtwork:Fireball, will use or reuse as artwork your custom artwork Fireball.png
  • i.e. ReUseArtwork:Spelldancer/Courtesan, will use or reuse the vanilla image Courtesan.png, that is located in the Spelldancer folder.
  • The vanilla file structure is Discipline/Card Name.png, i.e if you click on the Cat Burglar, it'll say Discipline Shadow. Therefore to use his artwork in a card you define: ReUseArtwork:Shadow/Cat Burglar
  • Commodity:[string], You can specify that Card is a commodity of a certain type. i.e Commodity:Spice
  • Only non-Equipment Actions can be marked as a Commodities
  • Commodities are 'minor burdens' in your Deck, you can still discard them, but they can deprive you of a card draw
  • Commodities cards can only be given as Event rewards (i.e Loot:Folkswave Coffeebeens) and they can't be converted to skills
  • Of course you can craft them in a way that replace themselves i.e also have Focus:1
  • You can define the commodity as any type you like, but as long as you do this card will be marked as sellable to merchants [Sell Commodities]
  • You can specify a specific price or have the price determined automatically: Commodity Autocalc Price = 75 + (125 x Tier x Merchant Whim)
  • SubElement:[string], Action Damage source will display as that of SubElement (for flavor) i.e SubElement:Ice, card Element will remain that of the set Element, i.e Water.
  • Damage source remains intact & your enemy will still receive Water damage.
  • Element:Ice, will still cause an Error, in ER Ice is a subElement of Water.
  • If a SubElement is defined, i.e SubElement:Thunder You still need to define Element i.e Element:Air. Then the card Element will display as Element (SubElement). i.e Air (Thunder), and Damage as [This deals x Thunder Damage]
  • SummonRace:[string], Summon's Race will set to that of the SummonRace:[string], i.e SummonRace:Undead
  • Added the SummonRace definition in all the Summons.
  • SummonRace will now properly determine the result of various existing effects like Consecrate & Desecrate (and laying the groundwork for future effects to only affect allies of a certain race.)
Action Effects - Part 5
Conditional & Contingency Trigger Additions
  • Echo actions can now be treated as a counter in Conditional Triggers by using [Card Name +*] as [Counter]
  • So you can now essentially create any type of counters to test for OnEnemyStatus[Counter]:x, AddEffect[Effect]:x
  • i.e OnEnemyStatusAnd Now Sleep +*:1, AddEffectChaotic:8, will Add the Chaotic effect if the enemy has the 'And Now Sleep' counter
  • Conditional & Contigency Triggers can now use a Synergy as an Effect but by adding a * in the end of the effect
  • i.e AddEffectChaotic*:8, will add a Chaotic Synergy effect instead of the Chaotic effect
  • Conditional & Contigency Triggers can now use Spellcraft as an Effect but by adding a # in the end of the effect
  • i.e AddEffectSloth#:1, will Spellcraft the Demon 'Sloth' card instead of triggering the "Sloth" effect
  • i.e ContingencyEffectPanic Attack#:1, will Spellcraft the Illusionist card 'Panic Attack'
  • New Action Type - Trinkets
  • You can create Trinket cards by defining them using both Singleton & Trinket keywords i.e Singleton:1, Trinket:1
  • Trinkets cost more than other cards of with otherwise same tier (or uses if they are consumables)
  • Trinkets can be bought in Towns at the Consumables & Trinkets section
  • Trinkets can be quickly accessed by using the 'Backpack' button along with your Consumables (Once per turn discard your hand to fetch the first 4 trinkets or consumables in your Deck)
  • There is not a limit how many trinkets and consumables you can have in your Deck, however the Backpack button will only Fetch 4 per turn

New Action Effects in EA 0232
  • ChooseOne[CardName]#[Cardname]#[Cardname]#[Cardname]:1, Choose One: [CardName] or [Cardname] or [Cardname] or [Cardname].
  • Choose one can be used to choose from 2 to 4 Cards
  • i.e ChooseOneCharge#Taunt:1, Choose One: Charge or Taunt.
  • i.e ChooseOneFear#Panic Attack#And Now Sleep:1, Choose One: Fear or Panic Attack or And Now Sleep.
  • Instead of a card name you can use 'Random Card'
  • i.e ChooseOneRandom Card#Fear:1, Choose One: Random Card or Fear.
  • i.e ChooseOneRandom Card#Random Card:1, Choose One: Random Card or Random Card.
  • When the effect resolves 'Random Card' is no longer a random but a specific card randomly choosen card, so you can see which card it is & choose it or not.
  • There can only be a single 'ChooseOne' keyword per card

New Action Effects & Improvements in EA 236
  • Contract: If Target Dies while Contract is active, bring them back as an Infernal Servant Ally.
  • Contingency Actions Expanded
    • Contingency Actions can now check if the Caster has a certain Buff (Retribution, Defend, Empower, Concealment etc.)
    • i.e OnCasterStatusConcealment:10, will check if the Caster's Concealment is more than 10%
    • Contingency Actions can now check if the Caster has a certain Damage Type Amplified (Fire, Earth etc.)
    • i.e OnCasterStatusFire:5, will check if the Caster's Amplify (Fire) is more that 5
    • Contingency Actions can now check if the Caster has a certain Echo Action in Effect with duration greater than the value
    • i.e OnCasterStatusFeed +*:2, will check if Feed is active (Echoing) & has more or equal than 2 duration
    • (There isn't a check to see if the value of the above check is less than x)

Additions in EA 0240

The following DoTs will now affect the Player similar to how they affect the enemies:

  • Bleeding x: Player will lose 1 HP / Bleeding Status.
  • Burning x: Player will lose 5 HP / Burning Status.
  • Envenomed x: Player will lose 3 HP / Envenomed Status.
  • Frostbite x: Frozen Status will affect the Player as Frostbite. Won't get immobilized but will lose 1 HP & 3 AP / Frostbite Status
  • These effects will be set with Bleed, Burn, Venom & Freeze if the Actions that have them target the Player
  • They can also be set with CustomBuff[Buff] i.e CustomBuffFrostbite:2, CustomBuffBleeding (when we want to inflict them to Player, prevent the optimal target changing to Enemy & prevent affecting the Enemy)
Action Effects - Part 6
New Action Effects & Additions in Later Builds
  • ControlArchetype[Archetype/Faction]:x, If Target is (of) [Archetype] & has Power less/equal than x, they become an Ally for [Card Level] Turns. Once the effect ends they are removed from Combat.
  • TargetArchetype[Archetype/Faction]:1, Unless the Target belongs in the required Archetype or Faction, Action will Fail.
  • TargetArchetype can also be non-Undead
  • TargetType[Self,Ally,Enemy]:1, Unless the Target is of the required Type, Action will Fail. (Unlike Optimal Target this is a hard requirement for the Action to Work.)
  • CustomBuff[Buff]:x, Player gets +/-x "Buff". This "Buff" doesn't have any effect on each own, however it can be used in conjuction with contingency effects.
    • i.e CustomBuffVengeance:3, Player gets Vengeance 2. Vengeance doesn't exist as a Buff. The modder made it up.
    • OnCasterStatusVengeance:4, ContingencyEffectWrath:8, if the Player has Vengeance 4 deal 8 Wrath Damage etc.
    • i.e CustomBuffClarity:2, Player gets Clarity 2.
    • OnCasterStatusClarity:2, ContingencyEffectSense Thoughts#:1, if the Player has Clarity 2, craft the Card Sense Thoughts etc.
    • Custom Buffs will Debuff along with Defend,Retribution etc. during the Debuff phase
    • You can use ie. CustomBuffDefend:x, to adjust the player's Defend (or any other existing Buff).
    • CustomBuff has the highest trigger priority after Empower, so it will trigger before the Contigency effect resolves
  • DebuffAll[Buff]:1, Player loses all their points of Buff.
    • i.e DebuffAllDefend:1, Player loses all their Defend.
  • ExpendBuff[Buff]:x, Player loses x points of Buff. If they can't Action fails.
    • i.e ExpendBuffVigilance:2, Unless the player can pay 2 Vigilance Action fails. (Vigilance 2 is a CustomBuffVigilance:2)
    • if the Action triggers multiple times ie. due to Multicast or Fury, Expend Cost is paid only once.
  • Afterimage[Cardname]:x, After this Action (successfully) resolves, Create and Play x [Cardname]. You don't pay its AP cost, but still pay any Expend costs normally. [Cardname] Targets automatically You, Your first Ally or Your first Enemy (depending who is the Optimal Target). A card can have only one Afterimage effect.
  • BloodTribute[Cardname]:x, If after this Action (successfully) resolves its target dies, Create and Play x [Cardname]. You don't pay its AP cost, but still pay any Expend costs normally. [Cardname] Targets automatically You, Your first Ally or Your first Enemy (depending who is the Optimal Target).
  • Flavor:[Text], will add a flavor text at the end of the card description
  • OverrideDesc:[Text], will override the card text with a fixed text (no numerical values are calculated). Flavor will append to that text if it exists.
    • Both Flavor & OverrideDesc can't have the , character in their text. If you need one use the ; character. It will be replaced with a comma:
    • i.e [card effect], OverrideDesc:Deal 5 + Card Level Intense Damage; if the Target is Witch; Warlock; or Necromancer., [next card effect]
  • Blood Offering:x, Lose x HP & Gain x/2 Blood Surge. Blood Surge can be used by Blood Mages to trigger various additional effects in their Actions. Any Unused points Debuff at End of Turn.
    • (This effect could have been recreated by using negative Healing and a CustomBuff, but whereas Card Upgrades reduce the HP cost they increase both Blood Offering cost & gain and I wanted to be able to use it as a Synergy.)
  • Spell Component:1, This card won't trigger any Active Synergies, but instead Modify or Expand them with additional effects.
    • i.e You play a card with Synergy Damage & Synergy Defend. If the next card is not a Spell Component those effects will be added to the next card you play and trigger as normal. If it is a spell component they'll be ignored, and any synergies in the Spell component will be added in the Active Synergies.
  • Enlightenment effect can now target an Ally. If does the Ally will gain the XP instead. (You can enforce targeting an Ally if necessary using TargetTypeAlly:1)
  • It's no longer necessary for the Class Archetypes to declare a starting Weapon or Equipment
  • You can now define 2H weapons. Define them exactly like before and also add is2H:1
  • ie. Damage:3, Defend:1, Persistent:1, Slot:0, is2H:1, Actions:2, Tier:1, Element:Bludgeoning
  • If the player Equips a 2H weapon, any equipped offhand or shield items are unequipped
  • If the player Equips an offhand/shield while having a 2H Weapon equipped it will get unequipped before equipping the offhand item
  • You can now check if the Caster has a Custom or Vanilla buff less than a certain value:
  • If you have [Buff] but is less than x, then contingency triggers
  • Caster needs to have this buff at a non 0 value. So if they don't have it or it's more than x contingency won't trigger
  • i.e OnCasterStatusDefend--:3, is true if the Caster has Defend less than 3
  • i.e OnCasterStatusDeus Ex Machina--:1, is true if the Caster has 'Deus Ex Machina' (CustomBuff) less than 1
  • You can now give a CustomBuff as part of a Conditional or Contingency Statement by appending ++:
  • OnCasterStatusDefend:3, ContingencyEffectVigilance++:1 [if the caster has defend 3+ they gain +1 vigilance]
  • OnCasterStatusVigilance--:3, ContingencyEffectVigilance++:2 [if the caster has vigilance but its less than 3, they gain +2 vigilance]
  • You can now use the Events LootOne as an Action Effect. To pick from a choice of 2-4 cards and add one to your deck. Illegal choices are disabled. Syntax for the Action effect is: LootOne[Cardname]#[Cardname]#[Cardname]#[Cardname]:1
  • Farthings:x, can be used as Action effect to give or remove farthings from the player. Farthings can never drop below 0 (player be in Debt) or go above 1500 (current Farthings limit).
  • Order:x, can be used as Action effect to give or remove Order from the player. Order can never drop below -100 or go above 100
  • Karma:x, can be used as Action effect to give or remove Karma from the player. Karma can never drop below -100 or go above 100
  • OnCasterStatusFarthingsMore & OnCasterStatusFarthingsLess
  • OnCasterStatusKarmaMore & OnCasterStatusKarmaLess
  • OnCasterStatusOrderMore & OnCasterStatusOrderLess
  • MaxDeckCopies:x, You can have x copies of this card in your Deck. x Can be of any positive value from 1 to Max Deck Size.
  • Amplify effect expanded: In Addition to Amplify:x which still works as before, you can now specify a specific or more than one elements, like so: AmplifySlashing:3, AmplifyDark:-3 etc.
  • StartEvent[Event], will execute [Event] if no enemies are present. Will display in Card as 'Event. ' i.e StartEventCamp:1, playing card will Start the [Camp] event.
  • ChangeAllyType[Type]:1, will change target Ally Type to [Type]
  • ChangeAllyElement[Element]:1, will change target Ally Element to [Element]
  • ChangeAllySpecial[Ability]:x, will change target Ally Ability to [Ability:x]
  • Added support for multiple Afterimage & BloodTribute effects in the same card
  • Added support for the following Composite Effect combinations to play well together:
  • ContingencyEffectControlArchetype[Archetype], AddEffectControlArchetype[Archetype], SynergyControlArchetype[Archetype],TeamworkControlArchetype[Archetype]
  • ContingencyEffectAfterimage[Card], AddEffectAfterimage[Card], SynergyAfterimage[Card]
  • SynergyBloodTribute[Card]
  • ContingencyEffectAdjustStatus[Status], AddEffectAdjustStatus[Status], SynergyAdjustStatus[Status], TeamworkAdjustStatus[Status]
  • ContingencyEffectEnemyBane[Archetype], AddEffectEnemyBane[Archetype], SynergyEnemyBane[Archetype], TeamworkEnemyBane[Archetype]
Action Effects - Part 7
Blood Tribute Additions

  • Originally Blood Tribute could only Create & Play cards ie. BloodTribute[Card]:x, i.e BloodTributePummel:1, (If the target dies you play a pummel card on the optimal target). BloodTribute can now trigger Effects, Synergies, Spellcraft & CustomBuffs using the following syntax:
  • BloodTribute[Effect]:x, ie. BloodTributeFocus:2 (If the target dies you draw 2 cards)
  • BloodTribute[Effect*]:x, ie. BloodTributeFocus*:2 (If the target dies the next action gets the focus 2 effect)
  • BloodTribute[Card@]:x or BloodTribute[Card#]:x, ie. BloodTributePummel@:1 (If the target dies Create & Draw a Pummel card)
  • BloodTribute[CustomBuff++]:x i.e BloodTributeBlood Surge++:2, (if the target dies you get +2 Blood Surge)
  • As a reminder a card can have any number of blood tribute effects and they'll trigger in the listed order ie.
  • BloodTributeConcealment:5, BloodTributeSneak Attack*:3, BloodTributePummel:1, You get Concealment 5, You get Synergy Sneak Attack, Pummel triggers and deals Sneak Attack damage to the 'optimal' target. (the first enemy or you if there is none around). You may want to use a custom text description however, as way too many blood tributes effects won't fit the description box.
  • BloodTribute can also use the new Scripted Effects (see section below)

Swift Actions
  • New Action Keyword Swift:1, Upon Draw: Discard this Card & Play a free Copy.
  • Swift cards are discarded and smart-casted instantly the moment you draw them (they auto-target the first enemy, first ally or you)
  • Swift cards can harm the player if they deal damage and no enemies are around. ie when entering a new node (so use this keyword with caution).
  • All On Draw effects in the Swift cards trigger normally

Choose & Play One Actions
  • New Composite Keyword PlayOne[Card#Card#Card...etc]:1, Choose One Card and Smart Cast it (play it) on the optimal Target (which won't necessarily match the parent card's target)
  • PlayOne effect is a Bonus effect & it triggers after the parent card resolves. So any synergies granted from a play one card, will affect the next card played not the parent card.
  • Player must pay all casting costs normally for the chosen card to get played. (Both AP & Expend Costs)
  • i.e etc..., PlayOnePummel#Beat Down:1, etc... will use Pummel or Beatdown on the First Enemy.
  • Can use the same keywords with ChooseOne ie. PlayOnePickFromMercenary#PickFromShadow#Random Card:1
  • PlayOne was created to be used mainly as an Ally Ability. The syntax is similar with ChooseOne: ie. AllyAbilityPlayOnePummel#Beat Down:1
  • PlayOne additionaly supports non-composite effects, Synergy, Spellcraft & CustomBuff & Scripted Effects
  • ie PlayOneFocus#Invoke:1, after the Action resolves you can additionally choose and Play a Spell Component Card with Focus:1 or Invoke:1
  • You can also use * for Synergy, @ for Spellcraft (not #) & ++ for a CustomBuff.
  • ie. PlayOneDamage*#Grace++:3, Choose & Play a Spell Component that grant +3 Damage Synergy or +3 Grace

Scripted Effects
  • Experimental/Supports: BloodTribute, PlayOne, Gambit, AddEffect, ContingencyEffect
  • Scripted effects allow to create a sequence of effects and use it when the supported keyword triggers
  • To create a Scripted Effect you can use this syntax: effect=value;effect=value;effect=value;...;effect=value
  • This produces a (temporary) card containing all the scripted effects and counts as a 'Spell Component', additionally its Action Points are set to 0 & Element equal to the parent Element.
  • It's recommended to only use non-composite effects in Scripted effects & those that are explicitly supported through symbols (Synergy *, CustomBuff ++ & Spellcraft @). Otherwise the parent card might not behave as intended.
  • Usage: if your Scripted Effect is Discard=1;Focus=1;Damage*=3. To add it use [Supported Composite Keyword][Scripted Effect]:1.
  • ie. BloodTributeDiscard=1;Focus=1;Damage*=3:1, which basically upon enemy death will create and play a card with all these effects. You can also combine multiple BloodTribute statements into 1 ie. BloodTributeConcealment:5, BloodTributeSneak Attack*:3, BloodTributePummel:1 into this: BloodTributeConcealment=5;Sneak Attack*=3;Pummel@:1. In both cases you'll probably end up providing a custom Description override.
  • ie. in PlayOne we can break down its x Effects into Scripted Effects [Discard=1;Focus=1;Damage*=3] & [Concealment=5;Sneak Attack=3;Silver=2;Damage=1] and we have the definition: PlayOneDiscard=1;Focus=1;Damage*=3#Concealment=5;Sneak Attack=3;Silver=2;Damage=1:1, which lets you choose among those two temporary Scripted Effect cards and play one.
  • i.e OnCasterStatusDark:5, ContingencyEffectDrain=3;Damage*=2:1 etc. Bonus effect card has Drain 3 & Damage Synergy 2
  • i.e OnEnemyStatusShield:5, AddEffectPummel@=1;Double*=100;Intense*=5:1 etc. Bonus effect card crafts a Pummel card and gives Double & Intense Synergy

Gambit Effect
  • Gambit[Card#Card#Card...etc], One Card is chosen (randomly), and is Played (for free) on the Optimal target.
  • Gambit supports the exact same features and syntax as PlayOne. But instead of picking a card to play (& pay the AP cost), a card is chosen randomly & played for free.
  • i.e GambitDamage=3;Defend=-3#Drain=4;Amplify*=-3:1, First card will give Damage +3 & Defend -3 & the second card Drain 4 & Synergy Amplify -3

AllyAbility Additions
  • AllyAbility can use Scripted Effects ie. AllyAbilityDamage=3;Focus*=1:1
  • Gambit & PlayOne can be used as ally abilities: AllyAbilityGambit[Sequence]:1, which can contain or not scripted effects. i.e AllyAbilityGambitDamage=4;Defend=-2#Amplify=-4;Judgement++=1:1
  • (When crafting complex/composite ally abilities or when using scripted effects, it will save you lot of headaches to try live the card using the ReClone command in the modder shell. Restarting ModManager will reset any changes to vanilla cards made this way.)
Action Effects - Part 8
DebuffAll Additions
  • You can use DebuffAll without specifying a status to debuff all statuses (both positive & negative)
  • i.e DebuffAll:1, will debuff everything.
  • You can still specify effects like before ie. DebuffAllDefend:1, will debuff the Defend/Vulnerability Status

Ongoing Actions & Dissipate
  • Ongoing:1, This Action is played for free at every EoT, till it Dissipates or its original Target dies.
  • Ongoing:1, is a modifier of the Echo effect. To define an action as 'Ongoing' you need to use both: i.e Ongoing:1, Echo:1, etc...
  • Limitations: Ongoing actions will persist till the player quits the game (Echo & Ongoing Actions aren't saved in Progress to prevent getting stuck in suicidal echo chains.)
  • You can also break an Ongoing action before its target dies by including a Conditional or Contingency statement, that triggers 'Dissipate' on success.
  • i.e Echo:1, Ongoing:1, Vulnerable:3, OnEnemyStatusVulnerable:5, AddEffectDissipate:1, etc. Action will dissipate after it triggers, performs the check & finds that the enemy has 5+ vulnerable. Otherwise it will stay ongoing (keep echoing) till enemy dies or player exits/reloads the game.
  • i.e Echo:1, Ongoing, Healing:5, OnCasterStatusHPMore:10, ContingencyEffectDissipate:1, etc. Action will dissipate after it triggers, performs the check & finds that the PC has over 10 hp. As long as the PC has less, action will stay ongoing (keep echoing) till the PC dies or exits/reloads the game.
  • Dissipate can only be invoked as part of a Contingency/Conditional Statement in the Ongoing Action like the examples above (not as a part of a Scripted effect and not as a Synergy). i.e SynergyDissipate won't work, neither something along the lines of ContingencyEffectDrain=3;Dissipate=1:1

Hex Ward

  • Hex Ward:x, Your Hex Ward gets +x. (Absorb the next {0} points of Bleeding, Feeblemind, Envenomed, Burning & Frostbite Damage.)
  • Hex Ward doesn't remove those effects, just mitigates their results when they trigger.
  • i.e Hex Ward of 4 won't remove a Bleeding of 3. 1st Turn/Bleeding 3: You Lose 3 Hex Ward instead of 3 HP. 2nd Turn/Bleeding 2: You Lose 1 Hex Ward & 1 HP instead of 2 HP. Hex Ward is now gone. 3rd Turn/Bleeding 1: You lose 1 HP etc. You Mitigated 4 out of 6 Bleeding Damage.
  • i.e 'Burning' the deadliest DoT deals 5 damage per status. Player needs 30 points Hex Ward to fully mitigate a Burning Status of 3: 1st Turn 15, 2nd Turn 10, 3rd Turn 5. 'Bleeding' is the weakest DoT and deals 1 damage per status. Player needs 10 Hex Ward to fully mitigate a Bleeding Status of 4: (1st Turn 4, 2nd Turn 3, 3rd Turn 2, 4th Turn 1). However if the Player is both Burning and Bleeding, they'll need the Sum of 40 Hex Ward to fully mitigate both effects etc.
  • Hex Ward will persist during the same Encounter & will DeBuff when changing node similar to 'Defend'

Discovery

  • (New Keyword) Discovery[Perkname]:1, Player Permanently gets the [Perkname] Perk
  • i.e DiscoveryRealistic Illusions:1 will grant to the Player the Perk Realistic Illusions if they don't have it already
  • Once the Player uses the Discovery Card & Claim the Perk (or if the player already has this Perk) the Discovery effect is removed from future instances of this card, but all other effects remain intact.

Active Equipment

  • Syntax Active:1, Makes Passive Equipment behave like Active Equipment. Armors (s2) & all Accessory Slots (Misc (s3), Ring (s4), Amulet (s5) & Cloak (s6)) are by default "Passive Equipment" (they get Auto Casted), but you can override this behavior using Active:1 in the equipment definition. Equipment with Active:1, will be drawn instead of Auto Casted. Player can choose to use it or not similar to Weapons & Shields & if unused equipment is discarded at EoT.

Equipment Durability & Charges

  • Equipment Cards can have Durability (Weapons, Offhand, Armor & Cloak) or Charges (Accessory, Ring & Amulet)
  • Uses/TotalUses will now work for equipment cards and will display as Durability:x/x or as Charges:x/x.
  • Under the hood you just declare them like you would in a consumable. i.e Uses:10, TotalUses:10. As long as the card is equipment (Persistent:1) Uses will become automatically Durability (or Charges).
  • Once an Equipment Card Durability (or Charges) drops to 0, it loses all XP, is Unquipped & is permanently Removed from Inventory (Durability/Charges/Uses are common for all the instances of a card and they reset to TotalUses each time the card's Uses drop to 0.)

Repairing Equipment

  • New Action Effect: RepairEquipped[Item]:x, (Currently) equipped [Item] restores x Durability up to their maximum.
  • Item can be Weapon, Offhand, Armor or Cloak
  • This effect can't replenish Charges or Uses
  • i.e RepairEquippedOffhand:3, will restore the Offhand/Shield item's durability (if one is equipped) by +3.
  • Effect is ignored if there is no Item Equipped in that slot or if the item equipped in that slot doesn't have limited uses

Defining a Card Set Expansion

  • New Actions DB directive: @Expansion [Expansion Name (or Custom Filter)]
  • You can use @Expansion to create a custom filter for your card set, so you can easily search for its entirety in the Player's Handbook
  • i.e @Expansion Blood Coven Rise, will add in all Cards of the set the keyword 'Blood Coven Rise:1'. Searching for 'Blood Coven Rise' in the Handbook will show all the cards of that set.
  • Expansion Name should never match or contain a keyword, as all cards in set will get it. i.e @Expansion Spell Component, will give all cards in the set Spell Component:1. It also can't contain the special character :.
  • Only the last Expansion directive is taken into account so you can change the set midways if you want to group your set further.

Ignore Synergies & Fade

  • 'Spell Component' keyword in Equipment will display as "Ignores Synergies", for better flavor. The effect & long description is the same. Card won't trigger any active synergies.
  • New Action Keyword Fade:1, Once this Card's Uses/Charges/Durability drops to 0, Card is removed entirely from the Database for the duration of the Session (till a new game is started or resumed)
  • Card must have Uses/TotalUses for 'Fade' to trigger
  • Optimally Card should be Singleton, No Allies should use this card as Ability, can't be a PC Skill, shouldn't be a Blood Tribute/Choose One option etc. Any reference to this Card after is removed from the DB (for the session duration) can cause unforeseen errors or issues.

Nightfall & Daybreak

  • Added support for OnCasterStatus[Affinity]--:x type of checks. Contingency will trigger if the Casters Amplified Affinity is less than x. i.e OnCasterStatusBludgeoning--:3, will trigger if the player Bludgeoning Damage (amplify bonus) is less/equal to 3.
  • Daybreak:1 & Nightfall:1 can be used as Action effects to set the World Clock to Sunrise (6am) or Midnight.

Unique Type Summons

  • New Action Keyword: UniqueType:1, (along with Unique:1), can make a Summon Type (SummonRace:[Type]), Unique.
  • ie using Unique:1, UniqueType:1, SummonRace:Hideout will name the Unique Summon as 'Hideout' instead of [Cardname]. The next 'Hideout' played (if also uses UniqueType:1) will replace the previous Summon.
  • New Perk Keyword: Unique:[Unique Category], in a Perk as benefit, will lock/remove all perks from the player that also are of this Unique Category
  • i.e if there are 3 Perks with Unique:Specialization & the player picks one of them the other two will get locked/removed from their perk list
  • [Unique Category] can be anything that makes sense in the modder
Editing and Adding new Enemies - Part 1
You can edit existing Enemies or add new Enemies by editing EnemyDB.Core.tdb (or better by adding a new Enemy database in ModLoaderUser.conf)

Enemies databases are expected here:


E:\Documents\SteamLibrary\steamapps\common\Erannorth Reborn\Erannorth Reborn_Data\StreamingAssets\Content\Encounter


And custom Enemy Artworks here:
E:\Documents\SteamLibrary\steamapps\common\Erannorth Reborn\Erannorth Reborn_Data\StreamingAssets\Content\CustomArtworks\Enemies

Enemies are declared in one line, using the key:value,[space]key:value structure similar to actions, but all the following fields are expected:

Name:Drunken Thug, Tier:1, Artwork:Thug3, Power:1, Health:7, Race:Human, Faction:Underworld, Archetype:Shadow, Element:Piercing, All:0, Slashing:0, Piercing:0, Bludgeoning:0, Fire:0, Air:0, Water:0, Earth:0, Astral:0, Light:0, Dark:0, Poison:0

Name, Tier, Artwork, Power, Health, Race, Faction, Archetype, Element and Damage Resistances.

Enemies are pooled by the system automatically based on their faction or race if faction is undefined. Bosses may appear on the stage corresponding to their Tier code.

Let's create a new boss called Aneska:

To use a custom artwork (700x700px png file located in the custom artworks folder above) use additionaly the UserArtwork flag. Artwork name should match the enemy name.

in Example:

BossID:30, Name:Aneska, Tier:D0, Artwork:UserArtwork, Power:8, Health:25, Race:Vampire, Archetype:Mystic, Element:Fire, All:0, Slashing:2, Piercing:2, Bludgeoning:2, Fire:-2, Air:0, Water:0, Earth:0, Astral:0, Light:-2, Dark:2, Poison:2

Will create a new Boss called Aneska, (her Artwork must be called Aneska.png and should be located in the custom Artwork folder above)

This new boss may now appear at the end of stage 1 as indicated by the D0.
D1 appears at the end of stage 2. etc. (Think D+Stages you survived so far)

Note that the BossID flag is completely unnecessary, I just needed something to count the bosses, and the file would break if structure is not following the given format.

Last but not least I want to mention that the Enemy name is the key to the database, therefore it has to be unique.

That's it. You now know how to create new enemies and edit existing ones to your liking.

EA Build 0266 Additions

You can now override vanilla artworks of Cards or Enemies just by providing .png files with the same name. (No need to override or provide a DB entries). Any Artwork found matching a Card's or an Enemy's Name in the CustomArtworks/Actions or CustomArtworks/Enemies folders will be used automatically. For example to replace Lanna's Artwork: put a Lanna.png in the CustomArtworks/Enemies folder of your mod. To replace Feral Anger card: put a Feral Anger.png in the CustomArtworks/Actions folder of your mod. That's it.

UserArtwork is only needed if you want to ReUseArtwork, a custom artwork. i.e to reuse your Feral Anger you would then do: ReUseArtwork:Feral Anger, UserArtwork:1 and card could potentially have a different name.

EA Build 0270 - New Enemy Tactics & AI related changes
  • DoTs affecting the PC (Fire Aura, Envenom, Frost Touch & Bleeding Strike): instead of a Melee attack enemy will inflict Burning, Envenomed, Frostbite or Bleeding to Player
  • Cover: while in Cover enemy won't receive retribution damage & cannot be harmed by Ranged Actions (unless they have an indirect targeting effect like Chaotic or an AoE effect like Pride etc.) When an Enemy gains Cover they lose Flying (and vice versa.)
  • Consecrate & Desecrate: Enemies will use this ability regardless of PC race to heal themselves, or offensively if the player race can be harmed by this effect but won't harm them.
  • Multiply: Upon Death Enemy will create 2x one-level-less clones of themselves
  • Feeblemind: While under this effect player will lose 2 AP per Feeblemind Counter & Discard 1 Card per Feeblemind Counter
  • Summoning Circle: Enemy summons a Devil Ally. While there are less than 3 Summoning Counters, and if enemies are less than 3 they can summon additional Devil Allies.
  • Benefactor [Benefit]: Enemy will provide certain boosts to their Allies.
  • Benefactor Flank, Benefactor Shield, Benefactor Concealment, Benefactor Cover, Benefactor Flying, Benefactor Spiked Armor, Benefactor Defensive Stance, Benefactor Poison, Benefactor Healing I-II will all provide the corresponding benefits
  • When declaring Enemy AI in Archetypes you can now specify the level an ability will appear
  • When activating Flanking enemies will skip their attack. Flank Debuff will activate only Upon Activation, enemies can then reuse it when all flank counters are gone.
  • ie. "AI":["Healing","Consecrate:2","Desecrate:2"], only Level 2+ Exorcists gain access to the Desecrate & Consecrate tactics
  • Deprecated AI Responses (Still work but should use the new ones instead)
    • Animal Ally => Animal Ally I, Animal Ally II & Animal Ally III
    • Raise Dead => Reanimate I, Reanimate II, Reanimate III
    • Healing => Healing I, Healing II, Healing III
  • Distributed the new tactics across all the Race & Class .json files
  • When enemies inflicting Debuffs they'll appear briefly in player's portrait as well
  • All Known Enemies Tactics will now appear in their portrait as small icons.
Editing and Adding New Enemies - Part 2
Finer control over Enemy Weaknesses & Immunities

  • New Archetype fields: Immunities:["Effect","Effect",...etc] & Weaknesses:["Effect","Effect",...etc]
  • You can define (or override/cancel) Enemies default racial weakness & immunities in the following statuses: Immobilized, Envenomed, Burning, Bewitched, Bleeding, Kill, Vulnerable, Weaken, Frozen, Entangled, Silver, Blessed, Light (weak vs Light means Consecrate is harmful & immune that Desecrate is harmful), Banish.
  • i.e Providing a 'Spirit' Archetype override with: Immunities:["Banish"], Weaknesses:["Immobilized","Bleeding"] will make all Spirits immune to banish but no longer immune to Immobilized & Bleeding. They'll retain any other vanilla immunities/weaknesses you didn't overwrite.
  • i.e Give your custom Archetype 'Naga' some Immunities:["Entangled","Bewitched"] & Weaknesses:["Silver"] without having it CountAs Serpentfolk etc.
  • You can still use CountAs to define a larger set of immunities/weaknesses in your archetype then finetune it. i.e CountAs:["Undead,Golem"] to give all the vanilla undead & golem immunities/weaknesses and also Weaknesses:["Bewitched"], to make this particular undead/golem creature Bewitchable etc.

Enemy Sets & Finer control over Enemy Tactics

  • EnemyDB files can be prepended with @[Enemy Set Name] to group enemies as part of an Expansion i.e @Core Set & @Blood Coven Rise split the vanilla Enemies into two groups
  • You can add individual Enemy weaknesses/immunities (aside from any defined in archetypes) by specifying them in the EnemyDB entry. Syntax is: Immunities:+Effect+Effect...+Effect etc. or Weaknesses:+Effect+Effect...+Effect etc. i.e in a Human Boss definition you can add Immunities:+Bewitched+Frozen, Weaknesses:+Silver to give them Bewitched & Frozen Immunity & Weakness to Silver regardless of their racial traits
  • You can add individual Enemy tactics (aside from any defined in archetypes) by specifying them in the EnemyDB entry. Syntax is: Tactics:+Tactic+Tactic etc. or Tactics:+Tactic=level+Tactic=level. i.e in a Shadow enemy that normally doesn't have Counter Attack you can add Tactics:+Counter Attack=3, to give all the Level 3+ enemies with that name Counter Attack
  • You can also mix & match i.e Tactics:+Flank+Healing II=3+Healing III=7 etc. Would recommend however to use the Immunities, Weaknesses & Tactics sections in the EnemyDB only for rare exceptions or Bosses

New Enemy AI Response: Retinue

  • Retinue: Enemy summons all the allies defined in the Enemy 'Retinue' field. Multiple enemies can be separated with *
  • Enemy need to have both the 'Retinue' tactic to trigger the effect & a Retinue field in DB
  • i.e Tactics:+Retinue=15, Retinue:Lanna*Pergyron,... if the Enemy is level 15 (has the Retinue tactic), once the retinue tactic triggers they'll summon Lanna & Pergyron to fight along with them
  • i.e Tactics:+Retinue, Retinue:Zefya's Handmaiden - Lv 7*Zefya's Handmaiden (A) - Lv 7, will call a Lv 7 version of Zefya's Handmaidens
  • If the Enemy/Enemy Level doesn't exist in the DB nothing will happen

Environment Additions & Metamorphosis

  • Enemies can be assigned to more than one Environment using the + sign i.e Environment:+Marsh+Forest, Enemy will appear in either Marsh or Forest environments but nowhere else
  • Enemies can transform to a different enemy upon defeat using the Metamorphosis:Enemy Name - Lv x or Metamorphosis:Boss Name properties
  • i.e Metamorphosis:Haunt - Lv 6, will turn the dead enemy into a Level 6 Haunt. (Level needs to exist in DB (Tier to Tier + 10) i.e for the T6 Haunt valid levels are 6 to 16)
  • Enemies can be excluded from Random Encounters by setting ExcludeFromRandomEncounters:1
  • Boss Encounters can have this way multiple phases ie.
  • a Boss called Zrygol, can have Metamorphosis:Zrygol the Reborn, and the definition of Zrygol the Reborn can have ExcludeFromRandomEncounters:1 so it won't appear as a random Encounter
  • Zrygol the Reborn, can also have a Metamorphosis:Zrygol the Divine etc.
Archetype files for Classes & Races
The archetype files are structured in .json format and you can also edit them in a plain text editor.

Let's explain a couple of things using the hunter's file as an example:

{
"BaseHealth": 6,
"BaseActions": 3,
"Strength": 1,
"Agility": 3,
"Resilience": 2,
"Intellect": -1,
"Willpower": 0,
"Charisma": -2,
"AI":[
"Defensive Stance"
],
"MainWeapon": "Silver Dagger",
"MainShield": "Hand Crossbow",
"StartingEquipment":[
"Hand Crossbow",
"Silver Dagger"
],
"StartingDeck":[
"Wolf Companion",
"Rapid Shot",
"Rapid Shot",
"Camouflage",
"Camouflage",
"Net Trap",
"Net Trap"
],
"SkillTree":[
"Camouflage:1",
"Rapid Shot:1",
"Net Trap:1",
"Bolt (Steel):2",
"Unleash:2",
"Bolt (Serrated):3",
"Blade Thrust:3",
"Eagle Sight:3",
"Spinning Shot:4",
"Bolt (Poison):5",
"Multi Shot:5",
"Heightened Senses:6",
"Fire Trap:7",
"Bolt (Fire):7",
"Critical Shot:7",
"Bolt (Silver):8",
"Final Death:9",
"Fire Blade:10"
],
"resistances":[

],
"proficiency":[
"Piercing:2",
"Slashing:1"
]
}

Stats are added on top of the racial stats which are added on the base scores of 10. A Human starts with all stats to 10, so a Human Hunter has strength 10+1 etc.
AI AI field contains AI behaviors, these are pre-scripted behaviours that enemies will display once certain conditions are met, ie. Heal or take a Defensive Stance, or attempt to Feed etc.
You can change which behaviors an archetype has, but you currently can't create new ones.

AI field currently accepts any or all of the following behaviors:
  • Regenerate
  • Feed
  • Healing I-III
  • Defensive Stance
  • Gallop
  • Concealment
  • Incorporeal
  • Poison
  • Reanimate I-III
  • Hex
  • Enrage
  • Empower
  • Hybrid Form
  • Animal Ally I-III
  • Flyby Attack
  • Spiked Armor
  • Counter Attack
  • Warcry
  • Illusory Copy
  • Dispel
  • Shield
  • Flank
  • Fire Aura
  • Envenom
  • Frost Touch
  • Bleeding Strike
  • Consecrate
  • Desecrate
  • Multiply
  • Feeblemind
  • Summoning Circle
  • Benefactor Flank, Benefactor Shield, Benefactor Concealment, Benefactor Flying, Benefactor Spiked Armor, Benefactor Defensive Stance, Benefactor Poison, Benefactor Healing I-II

MainWeapon & MainShield: The currently (or better initially) equipped items.
StartingEquipment defines both the equipped and unequipped items. Can contain additional initially unequipped items ie an alternative weapon, accessories or armor choices.
StartingDeck is The deck you start the game with. Basically a mix of your Race & Archetype's Starting Deck.
SkillTree: is the skills your character can unlock and use freely and at which level this happens. For instance Hunter can use Multishot at level 5, but do note that Multishot happens to be a Tier 3 Action which the player Unlocks at Hunter Mastery 60. So after they unlock the Action, they can then use it in every play-through they also meet its level requirements. You can add as many skills as you like here, or remove them entirely but do note that there is space for only 30 skills in the character sheet and i don't think i should support more.
Resistances & Profiency: Are similarly formatted and represent how much [Damage Type] you absorb, and the extra damage bonus you have when dealing [Damage Type]

Now a note about the stat blocks. The same files are used for the NPC enemies attributes, while some files are exclusively used for enemies. These are used to adjust their advancement (each enemy exists in 5 levels. The one you define and 4 extra generated by the system. In example a Tier 5 enemy, has a 5,6,7,8,9 & 10 Level version. So editing the attributes in those files may change the enemies in ways you have not foreseen or anticipated.

Additions in Later Builds
  • Archetypes Race & Classes can now count as additional races or classes for the purposes of targeting, immunities, weaknesses etc using "CountsAs":"Race/Class/Faction" (comma list)
  • i.e a Lich race could "CountsAs":"Undead, Mystic", will treat the Lich as both Undead and Mystic
  • i.e a Dhampir could "CountsAs":"Human, Vampire", will treat Dhampir as both human and vampire etc.
  • This will make the Race or Class a valid Target for TargetArchetype effects or relevant Auras like Desecrate or Consecrate. i.e a Succubus race could "CountsAs":"Demon" and properly receive Desecrate heal & Consecrate damage. Won't grant any additional cards or disciplines, and the additional templates doesn't have to be playable. In enemies for example CountAs will also affect their resistances to certain effects. i.e a custom Oakfolk enemy race could also "CountsAs":"Plant" and inherit all Plant immunities
  • Vampires & Death Knight Archetypes updated to use this new property, nothing much changed though as they were already counting as Undead
  • Runecaster Archetype updated to use this new property and now also counts as a Dwarf
  • Modders can specify a custom Deck Size limit on an Archetype by Archetype base.
    • "MinDeckCards":x, specify the minimum deck size. If unset it defaults to 18. ie "MinDeckCards":20
    • "MaxDeckCards":x, specify the maximum deck size. If unset it defaults to 60. ie "MaxDeckCards":120
    • Only a value set in a Class archetype can define the Deck Limits.
    • Your Archetype Definition can override this value temporarily i.e You set a Starting Deck of 100 Cards, and then set a Deck Max at 30.
    • Draft mode always override the MinDeckCards value and sets it to 12
    • You can start your custom Classes & Races with cards in Stash using "StartingStash":["Card name","Card name","etc"], in the Archetype json file
Adding custom Classes & Races
Now that you know how to create new Actions & Editing Archetype files creating new Custom Races and or Classes is as simple as declaring it in the ModLoaderUser.conf below your other entries so:

>> Races
Gnome
Dwarf
>> Classes
Blood Mage
Duelist
Acrobat


If you'd like a custom icon for your race, you can add it in
...\StreamingAssets\Content\CustomArtworks\Archetypes

Otherwise the fallback icon will be used.

Naming your Actions database as CardDB.[ArchetypeName].tdb will automatically load it in game each time the player chooses to play as this class or race, but you can also preload it by declaring in it ModLoaderUser.conf

Finally your Race or Class .json file needs to be placed in the corresponding folder in .../StreamingAssets\Content\Archetypes\Classes or .../StreamingAssets\Content\Archetypes\Races
If an Archetype file already exists there ie. you want to make Golem a playable race, just edit the file and define the initial equipment, starting deck, and skill tree actions. These fields will only affect the PC characters.

Example: Let's create a new race Squirrelfolk!

a) Place a Squirrelfolk.png icon (256x256) in ...\StreamingAssets\Content\CustomArtworks\Archetypes
b) Duplicate an existing json file, ie the Human.json file, and name your copy Squirrelfolk.json
c) if it was a Class you had to make sure that at the very least it has a main weapon equipped, and a starting deck, but since its a race all fields are optional. Of course if you don't make any edits you'll end up with a Human, which beats the purpose...
d) Now that you created your Archetype template, since it's a race, place it in ...\StreamingAssets\Content\Archetypes\Races
e) Put all your Squirrelfolk actions if any in a CardDB.Squirrelfok.tdb file and place the file in
...\StreamingAssets\Content\Actions
f) If you don't have a ModLoaderUser.conf create one in (...\StreamingAssets\Content) and/or add the following lines:

>> Cards
CardDB.Squirrelfolk.tdb
>> Races
Squirrelfolk


And you are done, the next time you open Erannorth Reborn, your new Squirrelfolk race will greet you in the Character Creation menu!

Now you may have noticed that the Core Races & Classes are declared differently:

>> Core Races
Human:0
Vampire:50
Lycanthrope:50
Demon:50
>> Core Classes
Mercenary:0
Shadow:25
Mystic:25
Hunter:25
Animist:25
Necromancer:25
Exorcist:25
Witch:25


The main difference between Custom and Core Races & Classes, is that the Core races are Setup to use internal icon resources, to support unlocking, achievements and appear in Card Collection. Therefore adding any new races in those fields won't work. What you can do with the Core Classes & Races is:
a) Change their Unlock cost to another number or Set it at 0 to remove the restriction entirely
b) Remove the Classes & Races you don't like to clear up space for a more customized experience or a total conversion mod.

Disciplines

All Classes & Races can also 'inherit' Cards from any other Class or Race. The Cards an Archetype can find & use are now declared in the 'Disciplines' section for the archetype. In practice this means that Custom Class & Race Archetypes can now inherit Cards from other Classes & Races.

For example let's say you want to make a Succubus race, but you'd like to be able to also use the core Demon Cards. Now you can do that by defining Disciplines:

"Disciplines":[
"Succubus",
"Demon"
]

This means that your new Race will be able to now find & use Demon cards as well, but won't be gaining Mastery in Demon Race. You only gain Mastery in your Race & Class. In this case in Succubus & whatever class you choose to go with it.

AdditionalActions

Additional (individual) Actions can be added on Archetypes using the AdditionalActions:[] section in Archetype.json.

i.e AdditionalActions:[
"Cleave",
"Prayer",
"Smite Evil"
]

This is useful in the cases, where you don't want your custom archetype to inherit an entire discipline, but a few handpicked actions.

Enforcing Gender Restrictions

Perhaps is something you want in your mods or not. And it's up to you whether you use it. But it does make a lot of sense in a supernatural world: Succubi & Nymphs according their lore are females for example while Incubi & Satyrs are male only etc.

So if you want to gender lock certain classes and races now you can.

  • Use "RaceGenderRestriction": "Female" or "Male" To restrict a race archetype
  • Use "ClassGenderRestriction": "Female" or "Male" To restrict a class archetype
  • Don't add, remove this line, or set the gender to "" to allow using this archetype regardless of gender.
The Mods Folder and Distributing your Mod
As of Build 0172, you can also create self contained mods, and place them in ../Content/Mods or zip them as a Modpack to be installed with the in-game Mod Manager.

A Modpack can contain any of the available modifications. Let's see some examples:

Example 1: You want to create a Modpack with 10 custom PC Artworks

1. Create a folder with your Mod name in ../Content/Mods

i.e.
../Mods/Sir Jorah's GoT PC Pack/

Keep the folder names descriptive but reasonably long as the Mod Folder will appear inside the Manager.

2. Create the folders ./Ragdolls/Male & ./Ragdolls/Female

Put your artwork files in the subfolders following these specs:

Dimensions: 231x575
Format: PNG
Filename: Doesn't matter

And that's it. The only consideration when creating Custom Avatar mods, is that at least 1 file of each gender should be present for the custom slider to unlock. i.e if you only want to provide 10 female artworks, add a blank .png file in the male folder.

3. Right click on your folder ./Sir Jorah's GoT PC Pack/ and send it to ZIP. You are done, and can distribute your mod to the community using your favorite mods portal ie. Nexus.

Example 2: You want to create a Modpack with 2 custom PC Races & 3 custom Classes

1. Create a folder with your Mod name in ../Content/Mods

i.e. ../Mods/World of Darkness/

2. Create a ModLoaderUser.conf file with your specifications:

i.e
>> Cards
CardDB.Brujah.tdb
CardDB.Gangrel.tdb
CardDB.Crusader.tdb
CardDB.Brawler.tdb
CardDB.Feral Warrior.tdb
>> Enemies
EnemyDB.Camarilla.tdb
EnemyDB.Generic.tdb
>> Races
Brujah
Gangrel
>> Classes
Crusader
Brawler
Feral Warrior

Or whatever.

Note: Cards & Enemies can each be in one DB file:
ie. MyCards.tdb & MyEnemies.tdb or whatever, as long as it's declared in the ModLoaderUser.conf it will get parsed.


3. Now that you have your DB files place the Actions in:
../World of Darkness/Actions

4. the Enemies in:
../World of Darkness/Encounter

5. the Race & Class Archetypes in their respective folders
../World of Darkness/Archetypes/Classes
../World of Darkness/Archetypes/Races

6. and any custom Artworks .png (they have to be png) also in their respective folders
Action Artworks in: ../World of Darkness/Actions
Class & Race icon: ../World of Darkness/Archetypes
Enemy Artworks in ../World of Darkness/Enemies

And that's it. If you want to pack your mod, to be installed via the in-game Mod Manager, Right click on your Mod folder ../World of Darkness, send it to .Zip and that's it. Contents will unpack in ../Mods automatically, so as long the zip retains the structure:

World of Darkness/[My Files]

You are good to go!





Creating new Game Modes & Adjusting Difficulty Settings
Game Mode .json files are placed in ../GameModes and should also be declared in your ModloaderUser.conf:

>> GameModes
Casual
Normal
Ironman
Endless

Any Game Modes you'll add in your Mod's ModLoaderUser.conf will appear in your Game Mode list to choose and play.

To create a custom mode. Name it as you like. In example:

>> GameModes
Josh Casual Run

And place the json file in ../Mods/[My Mod]/GameModes/Josh Casual Run.json

Let's break down the file and explain what each value does.

Josh Casual Run.json

{
"Mode": "Josh Casual Run",
"MinEncounterNormalNum": 1,
"MaxEncounterNormalNum": 3,
"MinEncounterEliteNum": 2,
"MaxEncounterEliteNum": 3,
"EliteLevelDifference": 0,
"XPGainMultiplier": 0.8,
"InitialHPBonus": 5,
"Endless": false,
"StagesToCompleteTheRun": 8,
"RunCompletionRewardTokens": 5,
"RunCompletionRewardMastery": 5,
"PermaDeath": false,
"ReincarnationToll": 0,
"Fatigue": true,
"FatigueThreshold": 10
}

  • Mode: The name of the game mode
  • MinEncounterNormalNum: The minimum amount of enemies that can appear in a Normal Encounter.
  • MaxEncounterNormalNum: The maximum amount of enemies that can appear in a Normal Encounter.
  • MinEncounterEliteNum: The minimum amount of enemies that can appear in a Elite Encounter.
  • MaxEncounterEliteNum: The maximum amount of enemies that can appear in a Elite Encounter.
  • EliteLevelDifference: How higher the Elite level can be above that of the Cleared Stage.
  • XPGainMultiplier: Earned XP are multiplied by this value.
  • InitialHPBonus: Player can start with additional (or less) HP than they normally would.
  • Endless: If this is set to true, then the 3 next values are useless, and the stage never ends (well in practice it does end at Stage 1000)
  • StagesToCompleteTheRun When the player clears this much stages, the run ends and they can claim the completion rewards.
  • RunCompletionRewardTokens If the players clears all stages this are how many tokens they'll get as an extra bonus.
  • RunCompletionRewardMastery If the players clears all stages this are how much mastery they'll get as an extra bonus.
  • PermaDeath If this is true, retaining your save file is not possible.
  • ReincarnationToll if this is value is above zero, retaining your save file will cost you Token = this value * stages cleared so far.
  • Fatigue: Enable or disable Fatigue, to prevent or allow infinite Deck combos
  • FatigueThreshold: If Fatigue is enabled, how many cards the player can use, before they start accumulating fatigue.

New Moddable Game Mode properties in EA0197

  • PlayerLevelAdjustment:x, Player will start the game at level x and with +25*x XP to spend in perks [Default if not set is 1 (Level 1)]
  • PlayerWealthAdjustment:x, Player will start the game with x Farthings [Default if not set is 25 + 50xPlayerLevelAdjustment]
  • StartingStage:x, Player will start their adventure in Stage x [Default if not set is 1 (Stage 1)]
  • StartingStageLength:x, if you set the StartingStage x more than 1+, this property will override the initial length of that Stage to x.
  • StartingNode:[Node], Set the 1st Node the player visits to the chosen node. [Default if not set is "Encounter"]
  • 1st Node is the one after the Entry as the 'Entry' always need to exist
  • Possible Nodes are: Encounter, Event, Elite, DungeonIntersection, CaveIntersection, BanditCampIntersection,Town, Camp, Merchant & Boss.

New Moddable Game Mode Properties in EA0198
  • DiscardPhase:[true/false], Enforces a (random) discard phase at End of Turn (Default, if omitted is false)
  • DiscardDownTo:x, if DiscardPhase is true, Player will discard at random down to x cards at End of Turn (Default, if omitted is down to 0 => Entire Hand)
  • DrawPhase:x, At the start of the new turn, Player will draw +x Cards in addition to their equipment. Unless used with a Discard phase player will keep stockpiling more cards each turn.
    (Default, if omitted or is set to 0 is to draw up to the vanilla intellect based [Hand] size value.)
Game Mode Properties - Addentum
Additions in Later Builds
  • EnemyHealthMultiplier x: Multiply enemy health by x (float: i.e 0.5 sets to half, 1.2 sets to 20% higher etc.)
  • EnemyPowerMultiplier x: Multiply enemy power by x (float)
  • EnemiesWithResistance x: x is Vanilla, Boss or None
  • PositiveEnemyResistanceMultiplier x: Multiply positive enemy resistances by x (float)
  • NegativeEnemyResistanceMultiplier x: Multiply negative enemy resistances by x (float)
  • "Sandbox": true or false, if true will activate the sandbox functionality.
  • Any Game Mode can turned into Sandbox, but it's recommended to set Endless:true.
  • All Stage related settings (like Custom Stage Sets, Starting Stage etc...) are overriden by the Location json files so won't have any effect
  • But you can set about everything else: enemy related properties, all pc related properties, custom rules etc.
  • "EnemyReinforcementsEveryXTurns":x, Every x turns the encounter lasts enemies of the same faction will join the combat
  • "ReinforcementsIfEnemiesLessThan":x, Reinforcement will only be called if enemies are less than x
  • You can adjust both values per game mode, if no values are set in either (all vanilla modes) both will default to 3
  • "ReinforcementsToCall":x, The number of additional enemies to call as reinforcements. If unset (most vanilla modes) defaults to 1.
  • "OnAdvanceNodeEvent":"EventID", If the player is about to advance a node, instead call EventID and don't advance the node
  • After this Event is called, the next time the player attempts to advance node they'll do so normally
  • After the Player advance in node, the next time they attempt to advance node the OnAdvanceNodeEvent is called once more
  • So what this does is changing the advance node behaviour to alternate between calling this event and actually advancing the node
  • OnAdvanceNodeEvent is disabled while exploring Dungeons, Caves or Bandit Camps
  • "ModeDescription": Display a plain text description of the Game Mode
  • "Draft": true or false, if true the player will open 12 Grimoires of 4 cards each and pick 12 cards
  • "ForceClass":"Class", if set will keep the customized attributes but change the player's class to the chosen class
  • "ForceRace":"Race", if set will keep the customized attributes but change the player's race to the chosen race
  • Forced Class & Race don't have to be a playable Classes or Races, as long as the class has a Starting Weapon Equipped, (Deck, Skills & Perk can be blank)
  • "BackpackDiscardCost":-x, a negative value (or zero), representing the HP Cost to discard unwanted cards from your hand by dragging them to your backpack (vanilla value is now 0 disabled)
  • To enable the old behavior of -2 HP cost: add this line in your game mode: "BackpackDiscardCost":-2
  • "APRegenRateBonusPerLevel":x.x, a float value that is used as a multiplier for your level, when determinining the bonus AP/Turn gain on level up.
    • i.e 0 or undefined means that the level doesn't affect the AP/Turn.
    • 1.0 means that you gain +1 AP Regen / level.
    • 0.5 means you gain +1 AP Regen every 2 levels etc.
    • 0.2 means you gain +1 AP regen every 5 levels etc.
  • "NodeBasedRulesActive":false or true, Enables or Disables all Node Based Rules except Leylines (Default is false / Disabled)
  • "LeylineRulesActive":false or true, Enables or Disables the Leyline Rules (Default is false / Disabled)
  • "LeylineAffinityMin":x, & "LeylineAffinityMax":x, (x should be positive & neither 0) can change the default 1 (min) to 3 (max) range to the desired range
  • i.e "LeylineAffinityMin":3, "LeylineAffinityMax":5
  • "LeylineAversionMin":x, & "LeylineAversionMax":x, (x should be negative & neither 0) can change the default -3 (min) to -1 (max) range to the desired range
  • "LeylineAversionMin":-5, "LeylineAversionMax":-2
  • If you like the concept but not the RNG you can set both Min & Max at the same value
  • "HoursPassWhileShopping":x, When refreshing (searching a merchant's inventory) in towns this much hours will pass in the world and shops will eventually close (The default value of 0 in vanilla modes, means 1 or 2 hours. Use -1 to Disable this System)
  • 3 of these properties [NodeBasedRulesActive, LeylineRulesActive, HoursPassWhileShopping] can be set with the Game Mode Editor [Node-Based Rules & Leylines] and [Time Spend Shopping in Towns] sections
  • LeylineAffinityMin, LeylineAffinityMax, LeylineAversionMin, LeylineAversionMax can only be set manually
  • "UseVisualPuppeteer":true or false, is this is true AND "OnAdvanceNodeEvent":"Puppeteer", instead of using the puppeteer event will use the new puppeteer wheel
  • "VisualPuppeteerIsProcedural":true or false, if false all puppeteer options are active, otherwise all options (except encounter) now have a chance to either be active or inactive, if the visual puppeteer is turn off, this setting has no effect.
  • Vanilla Puppeteer & Draft Modes now include both these options by default
  • Both options can be set in Custom Game Mode Editor [Fire Event When Changing Nodes], Choose either Visual Puppeteer (All Choices Active) or Visual Puppeteer (Procedural Choices)
  • "EnemyCanAmbushPlayer":true or false, activate or deactivate the Ambush rules
  • "EnemyAmbushChanceAtNight":x, chance to be ambushed during night time
  • "EnemyAmbushChanceAtDaytime":x, chance to be ambushed during day time
  • "ShowOnlyModeDescription":true or false, if true & a ModeDescription exists only this description will be shown and the run modification ruleset will stay hidden
  • ShowOnlyModeDescription, is now set to true in (vanilla) Casual & Normal Modes (Run modifications won't display to be feel less intimidating to new players)
  • "ActivateHourglass": true, will activate the Adventure mode Hourglass Button=>'Explore' Event in your current Game Mode
  • Added Hourglass option in the Game Mode Editor under Special Handlers
  • "BlankSlate":true, will remove all Cards, Class Skills & Perks from the character
  • Added Draft + BlankSlate option in the Game Mode Editor under Draw Phase
  • "ClearStartingDeck":true, will just empty the Starting Deck, to customize it faster (Manual Only)
  • "AdjustSkillLevelReqsBy":x, will increase or reduce the Skill Level Requirements by x (Manual Only)
  • ConvertToSkillCost:x, you can specify how many Tokens the player spends when converting a card into skill. i.e "ConvertToSkillCost":10 sets the cost to 10 Tokens. 0 or Undefined sets this value to default 5. You can set this value to -1 to disable the cost and make learning skills free.
  • DecayingBuffs:[list of strings], you can force certain buffs to decrease over time. [Empower,Bleeding,Feeblemind,Envenomed,Burning & Frostbite are already decaying by design, while some Debuff completely at turns end. Experiment or use this for your CustomBuffs.]
  • ie. DecayingBuffs = ["Defend","Nether","Transformation"] will make those 3 Buffs to decrease by -1 at the end of turn & while enemies are present (everything debuffs when changing nodes)
  • The new stash system can be disabled on a Game Mode basis using "StashIsDisabled":true, in the Game Mode json file. With the stash disabled cards removed from deck are lost till found/bought again.
  • You can force drafted cards to go directly to the Stash instead of Deck (Discard Pile) using
  • "AddToStashInsteadOfDeck":true, in the Game Mode json file. (This is now the default behavior of the vanilla Adventure Mode.)
  • "NonPassiveEquipment":true/false, setting this value to true will make all equipment Active (drawn to your hand instead of it getting played automatically, regardless the card definition.
  • "NoobProtection":true/false, true will prevent Smart Casted Actions from ever harming the Player. (Actions that would optimally target Enemy/Ally will no longer target the player.)
  • "PunishingReinforcements":true/false, true will make each wave of reinforcements progressively harder.
Game Mode Properties (Quick Reference)
Below are for reference all the supported Game Mode properties. (You can read what each does in the previous sections if you haven't already.)

  • Values marked as int require a number. i.e "MinEncounterNormalNum":4,
  • Values marked as bool require a value of true or false. i.e "ShowOnlyModeDescription":true,
  • Values marked as string require a text string. i.e "ForceClass":"Witch",

To create a game mode use any of the following properties together:
  • string Mode
  • string ModeDescription
  • bool ShowOnlyModeDescription
  • int MinEncounterNormalNum
  • int MaxEncounterNormalNum
  • int MinEncounterEliteNum
  • int MaxEncounterEliteNum
  • int EliteLevelDifference
  • float EnemyHealthMultiplier
  • float EnemyPowerMultiplier
  • string EnemiesWithResistance
  • int EnemyReinforcementsEveryXTurns
  • int ReinforcementsIfEnemiesLessThan
  • int ReinforcementsToCall
  • float PositiveEnemyResistanceMultiplier
  • float NegativeEnemyResistanceMultiplier
  • float XPGainMultiplier
  • int PlayerLevelAdjustment
  • int PlayerWealthAdjustment
  • int InitialHPBonus
  • float APRegenRateBonusPerLevel
  • bool Endless
  • bool Sandbox
  • bool Draft
  • int StartingStage
  • int StartingStageLength
  • string StartingNode
  • string UseCustomStageSet
  • string OnAdvanceNodeEvent
  • bool ActivateHourglass
  • bool BlankSlate
  • bool ClearStartingDeck
  • int AdjustSkillLevelReqsBy
  • bool UseVisualPuppeteer
  • bool VisualPuppeteerIsProcedural
  • int StagesToCompleteTheRun
  • int RunCompletionRewardTokens
  • int RunCompletionRewardMastery
  • bool PermaDeath
  • int ReincarnationToll
  • bool Fatigue
  • int FatigueThreshold
  • bool DiscardPhase
  • string ForceClass
  • string ForceRace
  • int DiscardDownTo
  • int BackpackDiscardCost
  • int DrawPhase
  • bool NodeBasedRulesActive
  • bool LeylineRulesActive
  • bool EnemyCanAmbushPlayer
  • int EnemyAmbushChanceAtNight
  • int EnemyAmbushChanceAtDaytime
  • int LeylineAffinityMin
  • int LeylineAffinityMax
  • int LeylineAversionMin
  • int LeylineAversionMax
  • int HoursPassWhileShopping;

i.e this is the Normal.json file which defines the Normal Game mode:

{
"Mode": "Normal",
"ModeDescription":"Normal is aimed for casual players who learned the game basics and now want to try their skills in a slightly less friendly environment than 'Casual Mode'. As 'Normal' spans for 6 Stages, it's recommended to have at least 30 Mastery with your chosen race and class to better enjoy their deck-building options.\n\nYou can potentially earn over 35+ Tokens & Mastery while completing this mode.",
"ShowOnlyModeDescription":true,
"MinEncounterNormalNum": 3,
"MaxEncounterNormalNum": 4,
"MinEncounterEliteNum": 3,
"MaxEncounterEliteNum": 4,
"EliteLevelDifference": 0,
"XPGainMultiplier": 1.0,
"APRegenRateBonusPerLevel":0.5,
"InitialHPBonus": 0,
"Endless": false,
"StagesToCompleteTheRun": 6,
"RunCompletionRewardTokens": 15,
"RunCompletionRewardMastery": 15,
"PermaDeath": false,
"ReincarnationToll": 1,
"Fatigue": true,
"FatigueThreshold": 8
}
Adding Custom Perks to Core or Custom Races & Classes
Similar to cards & enemies, a ModLoader needs to be aware of the Perk Databases in order to load them. Perk DB files should be located in /Perks (Either in Content/Perks or in Content/Mods/[Your Mod]/Perks) and can be declared in any ModLoaderUser file.

So for the sake of this example let's use the Mods folder and create a new Mod directory:

I'll just call my mod [Raven's ER Addon], you can call it whatever you like ;)

/Content/Mods/Raven's ER Addon/

in it I will created a ModLoaderUser.conf file and add these two lines:

>> Perks
PerksDB.Imba.tdb


Then I'll go and create this file in my favorite text editor inside the folder /Perks

/Content/Mods/Raven's ER Addon/Perks/PerksDB.Imba.tdb

Perks in the PerkDB are declared in 3 lines:

Strong, 50
You gain +1 Strength & deal +1 Bludgeoning Damage.
Strength:1, ProficiencyBludgeoning:1

first line:
Perk Name, Perk XP cost

second line:
A plain text description of the perk

I don't generate the description from the effects, to allow for more creative freedom and also because I suspect things will get pretty complex on what perks can do down the road. So describe the perk in any way you like.

third line (a comma separated list with the effects that can be as long as you like within reason):
effect:value, effect:value

These are the effects you can currently use:

Strength:x, Agility:x, Resilience:x, Intellect:x, Willpower:x, Charisma:x
Increase or decrease an attribute by x

HP:x, AP:x, Hand:x
Increase or decrease HP, AP or Handsize by x (be reasonable with how many perks can increase the Handsize)

Proficiency[Damage Type]:x & Resistance[Damage Type]:x
Increase or decrease a Damage Type Proficiency or Resistance.

Damage Types are: Slashing, Piercing, Bludgeoning, Fire, Air, Water, Earth, Astral, Light, Dark & Poison. So you can use ProficiencySlashing:x, or ResistanceAstral:x etc.

AddDiscipline:[Discipline] & RemoveDiscipline:[Discipline]

These keywords can give or remove disciplines from the Player.

ie. AddDiscipline:Mystic, RemoveDiscipline:Mercenary will give the Player the Mystic Discipline but remove the Mercenary Discipline. Now the player can find only Mystic cards in merchants & grimoires but not Mercenary cards, even if before they could

Disciplines determine the cards you can find, so losing or adding disciplines don't change your class or your skills

ModifyEffect[CardEffect]:x

This keyword can permanently alter how any numerical card effect is treated by the player.

i.e ModifyEffectDefend:-1, In all cards with Defend value, the Defend value is now -1 point less.
i.e ModifyEffectConcealment:20, All cards that provide x% Concealement, now provide 20% more concealment etc.

AddSkill[Card Name]

Will add a Card in the Player's Skill List. i.e AddSkillMountain Keep:1, will add the Mountain Keep cards in the player's skills.

Perks can modify Rations & Farthings carry capacity with [Max Farthings]:x & [Max Rations]:x. i.e Max Farthings:300, Max Rations:-1

So now that you created your PerksDB file, you only need to assign them to the Classes & Races.

Archetypes & Classes .json files are expected either in Content/Archetypes or in Content/Mods/[My Mod]/Archetypes in Races & Classes folders respectively. You could add them of course in any of the core races or classes as well.

You can see how to create and edit archetype files in a previous section, so let's discuss the text block that is missing from there. This is how the core Animist perks are declared:

blah blah,
"PerksTree":[
"Athletic:1",
"Earth Magic Training:2",
"Blunt-Weapons Training:2",
"Tenacious:3",
"Earth Magic Expertise:4",
"Blunt-Weapons Expertise:4",
"Earth Affinity:5",
"Earth Magic Mastery:6",
"Blunt-Weapons Mastery:7",
"Earth Conduit:8"
],

blah blah,

You can check out the whole file here: \Content\Archetypes\Classes, but basically you just add these lines inside the PerksTree section:

"Perk:Level that Unlocks",
"Perk:Level that Unlocks",
etc.

And that's it!

You now know how to create new Perks and assign them to Core or Custom Races & Classes.
Adding Custom SFX to Action Cards
Adding your own SFX to Action Cards is really simple.

First you need to create your mod folder and place all your audio files under Audio/SFX

They can be either WAV, MP3 or OGG files. But you do have to use a separate Mod directory for this, and not the root of the Content folder.

i.e Content/Mods/[Your Modname]/Audio/SFX

Name your files either with a Number ie. 1.wav, 2.wav, or if you plan for each card in your set to have separate audio files with the card names. i.e Devastating Critical.wav, Myrtul's Unholy Blast.wav etc.

Then in the card declaration add the UserAudio flag.

Example 1:

Lionheart, Soldier
Echo:99, Damage:9999, UserAudio:1, Tier:5, Element:Slashing

In this case, I need to name my audio file either Lionheart.wav or 1.wav. If I plan to use the audio file many times, 1.wav will make sense, as the Card name is unique.

Example 2:

Devastating Critical, Soldier
Damage:2500, Quad:100, UserAudio:1, Tier:5, Element:Slashing

can then use the same audio file.

While perhaps:

Example:3

Myrtul's Unholy Blast, Warlock
Damage:400, Chain:50, Tier:1, Element:Dark, UserAudio:2

Could use the audio file named 2.wav, or Myrtul's Unholy Blast.wav. But if you want it, not to use 2.wav, then make sure that this file doesn't exist, while the one with the card name does.

And that's it really.

0187 Revision - SFX Modding Additions & Improvements

  • Enemy Attack, Impact, Death SFX & AI Response sounds can be changed by modders.

    While declaring the Enemies you can use AttackSFX:[Soundfile], ImpactSFX:[Soundfile] && DeathSFX:[Soundfile].

    Sound filename doesn't have to be a number.

    i.e AttackSFX:ZombieMoan, ImpactSFX:BludgeoningImpact, DeathSFX:ZombieDeathCry

  • AttackSFX will play on attack start, ImpactSFX on attack impact & DeathSFX on enemy death. These Audio Files should also be located in ../Mods/[My Modname]/Audio/SFX

  • Currently core Enemies play only the Impact SFX and by default is their Damage Type i.e Bludgeoning. You can override all default Impacts of a type ie. all Bludgeoning impacts by providing a Bludgeoning.wav file.

  • You can override all special actions Effects i.e. the Gallop AI response, by providing a Gallop.wav file etc.

  • Card Activation Effect can now be set with the new and more versatile ActivationSFX:[Soundfile] which doesn't have to be a number & it can also use internal resources.

    i.e ActivationSFX:Poison will look for a file called Poison.wav (or mp3, or ogg) and play it each time the card activates.

  • Clicking an enemy on the gallery will also play its AttackSFX file (which by default isn't set)

  • Clicking a Card in Card Collection will display a larger artwork + the uncut version of the Card text & play its SFX impact sound, whether its internal or custom.
How to Add new Events (Or edit existing ones) 1/2
You can expand the current Events system, with your own events, by providing the .json file of the event. Any suitable .json files in the ../Content/Tales directory, or ../Mods/[Your Mod]/Tales directory will be added into the events database.

You can also provide custom artworks, 1 or 2 layers, by copying your artwork png files in ../Content/CustomArtworks/Tales or ../Mods/[Your Mod]/CustomArtworks/Tales.

Before I explain the file structure let's see an example:

{"ID": "Merchant Awake",
"Requirements": "",
"Unique": false,
"AutoIncludeOnwards": true,
"AutoIncludeInEventNode": false,
"BackgroundGraphic": "",
"MainGraphic": "Merchant",
"Title": "You come across a wandering Romani caravan",
"Narrative": "Their leader looks at you warily as you approach. His voice is shaking as he speaks, but still offers you hospitality according the Romani tribe customs.\n\n<i> 'Greetings friend. My water is your water...' </i>",
"Choice_1": "Ask to see their wares.",
"Choice_1_Requirements": "",
"Choice_1_Outcome": "His smile brightens at this question, and his voice becomes more confident. 'Come. Come friend. This way.'",
"Choice_1_Reward": "",
"Choice_1_ExecuteFunction": "Merchant",
"Choice_2": "Ask if you can buy any rations [-25 Farthings].",
"Choice_2_Requirements": "",
"Choice_2_Outcome": "He nods, and his voice becomes more confident. 'Yes, of course. We have food for all tastes! Come friend. This way.'",
"Choice_2_Reward": "",
"Choice_2_ExecuteFunction": "Rations",
"Choice_3": "Ask if you can camp here for the night [-1 Ration].",
"Choice_3_Requirements": "",
"Choice_3_Outcome": "He nods, and his voice becomes more friendly. 'Yes, friend. All the wanderers are welcome here. You can set up your tent there.'\n\n<i>8 hours later...</i>\n\nYou wake up feeling refreshed.",
"Choice_3_Reward": "",
"Choice_3_ExecuteFunction": "Camp"}


This is the merchant when he is awake.

What each field does

Don't be scared, it's much simpler than it looks. Let's see what each field does:

ID: ID needs to match with the filename, and it has to be unique. It's how internally I request these files. (This value isn't displayed in the user)

Requirements: This field is taken into account only if Unique is true. I'll be explaining what you can put in this field a bit later.

Unique: false or true, Specifies whether this event can only appear once in a run, or more than once.

AutoIncludeOnwards: false or true, Specifies whether to include a "Leave" button automatically to save time from creating one. You can still create one manually though. (For example if you are translating the event into a different language.

If the Leave button is auto-included it will take the first available slot 1 to 4.

AutoIncludeInEventNode: false or true, if this is true this event can appear in the 'Event' (Questionmark node) You probably want this value to be true, otherwise you'll have no way to test your event!

BackgroundGraphic: A Background graphic name. Just the filename without the png extension. You don't have to provide one, if your main graphic doesn't have transparency.

MainGraphic: Your main graphic. Again just the filename without the png extension. You should always provide at least a main graphic, but it can be the same for all your events.

Both Main & Background graphics are 700x700px but only the middle (2/3) vertical part is displayed.

Title: The title of the event, as displayed to the user

Narrative: The story or what this event is about. You can add newlines using the\n special character, bold, italic & underline using html syntax. ie. <b>this is bold</b>

Choice_x (1-4): The choice as it will be displayed to the user.

Choice_x_Requirements (1-4) If any of these requirement isn't passed the choice will appear disabled.

Choice_x_Outcome (1-4) The text that will be shown as a result of the player's choice (Replaces the Narrative text).

Choice_x_Reward What we'll reward the player for choosing this option

Choice_x_ExecuteFunction We can execute a specified function, (& in future builds chain scenes together.)

Giving rewards to the player

Each choice reward field can accept:

a) the name of a perk as value.
  • Perks can be awarded only once, so make sure they are unique and not part of a class or race perk list.
  • Perk description is appended in the story outcome text.
  • The Perk XP unlock cost is ignored and has no effect, but it still need to be set when declaring the perk.

b) Craft:Cardname, to craft and give player a copy of Cardname
  • i.e Craft:Reanimate, will give player a copy of Reanimate in hand
  • Card can be an equipment card, but that won't equip that equipment or add it to the player's inventory

c) Cast:Cardname, to use Cardname on the Player
  • i.e Cast:Omega, will summon the Omega unique companion

d) NextNode:[Node] can be used as a choice reward to change the next Stage node into [Node] which can also be a Tale ID. ie. NextNode:Merchant, will summon a merchant in the next node, and NextNode:Adventurer Corpse I, a dead adventurer to loot.

e) Triggering Encounters:
  • Encounter:[Random] & [RandomElite] can be used as choice reward to trigger a random Normal or Elite Encounter
  • Encounter:[Enemy - Lv x], can be used as choice reward to trigger encounter with a specified enemy (Enemy needs to exist in DB). i.e Order Recruit - T2, can be found from Level 2 to 12 (Non-Boss Enemies have a DB entry from Level [Tier] till Level [Tier + 10]).
  • For example you can use "Choice_1_Reward":"Encounter:Order Recruit - Lv 2, Encounter:Order Recruit - Lv 3" to summon 2 Order Recruits to fight the player, if they take this choice. But "Encounter:Order Recruit - Lv 1" wouldn't have any effect as this enemy doesn't exist.
  • You can see the Enemy Tiers in the compendium and calculate their level range
  • When triggering encounters from Events, the event box will hide, and choice outcome will display in the combat log.

f) A comma separated list of all the above
  • i.e Morheliss Blessing, Cast:Omega, Craft:Fireball, Craft:Fireball
  • Choice will grant: the Morheliss Blessing perk, Cast Action 'Omega' and craft 2 Fireball Copies, (not that the particular combo makes any sense, but you get the point)

Chance-based Rewards
  • All reward keywords can be turned into chance for a 'reward' by prepending 'Chance>x>' before the [Reward]
  • i.e "Choice_1_Reward":"Craft:Firebolt, Chance>25>Encounter:Random"
  • Will give player a 'Firebolt' in hand, but also has a 25% chance to trigger a random encounter
  • i.e "Choice_1_Reward":"Craft:Firebolt, Chance>50>Craft:Firebolt, Chance>25>Cast:Firebolt"
  • Will give player a 'Firebolt', adds a 50% chance to get an additional 'Firebolt', and a 25% chance to have a Firebolt blow on Player's face (with stats as if casted by the Player)

Restricting choices based on player's stats & attributes

Each choice requirement field can accept:

a) Race:[Race], will check if the Player is of chosen race
b) Class:[Class], will check if the Player is of chosen class
c) Gender:[Gender], will check if the Player is of chose gender
d) [Attribute]:x, will check if the Player's [Attribute] is higher/equal to x. ie. Strength:15
e) Level:x, check is passed if the player level is higher/equal than x
f) Stage:x, check is passed if the current stage is higher/equal than x
g) A comma separated list of all the above
  • i.e Race:Vampire, Strength:20, Agility:20
    [*[ Choice will become non interactable if the player fails in any of the checks.
  • Unique Tales can also have a 'Requirements' field, and the player needs to pass their requirements before the tale appears








How to Add new Events (Or edit existing ones) 2/2
Using the function field

You can use the "Choice_x_ExecuteFunction" field to either execute a function or chain another tale id. Current functions are: Camp, Rations, Chest, Backpack, Pouch, Grimoire, Journal, Merchant, Town, Cave, Bandit Camp, Dungeon, Path & Onwards.

Tales can also be chained by using the Tale ID as the function to execute (this will work if there isn't already a function of the same name)

i.e "Choice_1_ExecuteFunction":"Adventurer Corpse I"

Let's create a simple event:

{"ID": "Morheliss Shrine",
"Requirements": "",
"Unique": true,
"AutoIncludeOnwards": true,
"AutoIncludeInEventNode": true,
"BackgroundGraphic": "",
"MainGraphic": "Morheliss Shrine",
"Title": "You come across a shrine dedicated to Morheliss",
"Narrative": "Bones and skulls decorate this old shrine dedicated to Morheliss, the Goddess of Death & Undeath. ",
"Choice_1": "Make a blood offering to the Goddess",
"Choice_1_Requirements": "Class:Blood Mage",
"Choice_1_Outcome": "You don't have anything else at hand to offer, other than your own blood.\n\n<i>'May the Goddess' hand guide my actions'</i>, you whisper as you make a cut in your hand, and let the blood flow freely.",
"Choice_1_Reward": "Morheliss Blessing",
"Choice_1_ExecuteFunction": ""}


This is an example of a unique event, the choice to do a blood offering is only available for a Blood Mage character & once the make this choice they'll be awarded the perk Morheliss Blessing.

And that's it!

Additions in Build 0211
  • Requirements fields can now check for a particular environment, location and/or area
  • [New] "Environment:[Environment Type]"
  • [New] "Location:[Location Name]"
  • [New] "Area:[Area Name]"
    • ie. "Environment:Dungeon", in event or (event choice) will only show up if the player is in a Dungeon.
    • ie. "Location:Lucina, Area:McMagnus Cove", in event or (event choice) will only show up if the player is adventuring in 'Lucina' and in particular at 'McMagnus Cove'.
  • All Requirements can now act as their reverse by prepending 'Not:'
    • i.e Not:Class:Shadow, will pass the check only if the player isn't a Shadow.
  • Requirement field in a 'Tale' object can now be used for both Unique & non Unique instances.
    • If the Requirements of a unique event aren't met it will fall back into a random non-unique event.
    • If the Requirements of a non-unique event aren't met it will fall back into the adventurer corpse looting scenario.
  • Rewards field additions:
    • [New] 'RemoveChoice:All', Once the choice picked will remove all other choices from the player except onwards. Useful when you want the player to only pick one choice.
    • i.e Pick the Lock or Bash the Lock? Save the merchant guards from bandits or join the bandits vs the guards? etc.
    • [New] 'Invoke:[Discipline]', will create a random card copy from the chosen discipline, which can be of any tier or type so handle carefully
    • Equipment summoned this way has to be used this turn, otherwise it'll get discarded at EOT.
    • i.e Invoke:Loot, will create random loot card copy.
    • But I mainly create this to be used in Events to gather herbs, fish etc.
    • i.e assuming you have a Herbs card type (Vanilla DB now contains 19 Herbs) you could then do: Invoke:Herbs, to get a random card from that category.
  • Modder-Exposed Functions (changes & additions)
    • [Changed] 'Backpack' function generates 2 lootable items (Previously was 2 to 4).
    • [New] 'BrokenChest' function: will generate 1 to 2 lootable items.
    • 'Chest' function is unchanged and will still generate 2 to 4 lootable items. But neither of the three (Backpack, Chest or BrokenChest) mentions anywhere what container player looted, so you can use any of them for any lootable container.
    • [New] 'Feed' function: Vampire characters can feed to restore 15 AP & 10 HP in the process.

Additions in Build 0211.1
  • Requirements fields can now check if the player has enough Farthings
    • [New] "Farthings:[Amount]", i.e Farthing:50, will return true if the player has 50+ Farthings
  • Reward fields can now give directly as reward: AP, HP, XP, Farthings & Rations (without relying on special function or creating new perks)
    • [New] 'RemoveChoice:This', Will remove the current choice, not allowing to be picked twice. Executing most functions already include this behavior, so this is useful when you don't want to execute a function.
    • [New] Farthings:[Amount], i.e Farthings:-30, will take 30 Farthings from Player
    • [New] Rations:[Amount], i.e Rations:2, will give 2 rations to the Player
    • [New] HP:[Amount], AP:[Amount] & XP:[Amount], will directly increase or decrease Player's AP, HP & XP
  • Modder-Exposed Functions (changes & additions)
    • 'Store:[Discipline]', will open a merchant inventory with cards from that discipline
    • ie. "Store:Herbs", will open a Herbalist's inventory.

Additions in Build 0231
  • Custom Events can now re-use misc vanilla resources (That doesn't change the way you can use your custom graphics)
  • Artwork Graphics from the Action Cards using "Discipline/Card Name" in the graphics field. ie. "MainGraphic": "Spelldancer/Courtesan",
  • Artwork Graphics from the Enemy Cards using ">Enemy Artwork" in the graphics field. ie. "MainGraphic": ">Admiral Sinclair", (Normal Enemies Artwork filenames don't always match the Enemy Name. You can find them in the EnemyDB)
  • Artwork Graphics from the various Background Cards using "*CardBack1-11" in the graphics field. ie. "BackgroundGraphic": "*CardBack1",

Additions in Build 0246
  • After initiating an Encounter you can use as Reward "Log:Text without any comma or upper/lower dots" to display a text in the combat log. This text can't have the , or : special characters.
  • Choices can call the function 'TriggerGameOver' to instantly End the current game mode (Useful for adventure game modes where the epilogue is narrative and don't want to trigger the normal End Game screen.) i.e "Choice_1_ExecuteFunction": "TriggerGameOver"
Event System Addendum I
Event/Tale system Additions in EA Build 0247
  • Choices that player don't meet their requirements will now hide instead of just deactivate

Karma & Order
  • Events can reward the player Order & Karma (positive or negative) depending their Order/Chaos & Good/Evil tendencies. Using Karma:x & Order:x.
  • Similarly we can check if the players Karma or Order is greater/equal than x in Requirement fields: i.e Karma:5, will check if the player's Karma is >= 5, and Not:Karma:5 if the player's Karma is < 5
  • For negative Karma Not:Karma:-5 to check if the player's Karma is < -5, or Karma:-5 to check if the player karma is >= -5
  • It's up to you (the content creator) to decide how much Karma/Order the player will gain depending the Act, but generally none becomes pure Evil, a true angel, a Chaos incarnate or the beacon of Law & Order with a single act. And since this is a game values of -5 to 5 can give the player opportunities for redemption or to further sink to the darkness or to maintain a neutral behavior.
  • The concept of Morality is a deep conversation, but for the purposes of simplicity, Morality in Erannorth: imagine the popular commoner's beliefs in a medieval society during the Dark Ages and you are pretty close.

Event Additions in Later Builds
  • HasDiscipline:[Discipline] can check if the player has a discipline despite not being of the class or of race
  • ie Class:Necromancer, HasDiscipline:Necromancer, will work for both Necromancers & classes who learned the Necromancer Discipline from a Perk
  • Level<:x, will succeed if Level is < x. (shortcut for Not:Level:x)
  • Similarly Karma<:x, Order<:x, Rations<:x (Removed RationsLess), Stage<:x, HP<:x, AP<:x
  • Stage=:x, will check if we are in the exact Stage (this would make more sense for non-Sandbox modes Events, but will still work in Sandbox events too Stage => Area level)
  • ChooseOne:[Cardname]#[Cardname]#[Cardname]#[Cardname], can be given as reward to allow the player to choose and draw a card copy. You can use 2 to 4 cards and also "Random Card", to pull a random card.
  • LootOne:[Cardname]#[Cardname]#[Cardname]#[Cardname], can be given as reward to allow the player to choose and gain an action card in their deck or inventory depending where this card belongs. You can use 2 to 4 cards and also "Random Card", to pull a random card.
  • Events can now support up to 15 different choices
  • New 'Reward' property: RemoveChoice:AndRepeat, will remove the choice and then re-render it after re-evaluate its requirements. (Use this if a choice is repeatable, but it has requirements.)
  • LevelUp & Perk Points (LP & PP), can be given as Event Rewards using LP:x & PP:x as reward string respectively.
  • Mastery (for both Race & Class) & Tokens, can be given as Event Rewards using Mastery:x & Tokens:x. Or individually with RaceMastery:x & ClassMastery:x (Player's current Race & Player's current Primary Class)
Chaining Events to create Short multi-outcome Stories
Even though there will be a better method for crafting short stories. You can already do it with little effort. Let's see a hands on example (Contains spoilers from an in-game Event).

This a single event spanning in 3 different .json files, as player's choices can lead to potentially different outcomes. And only the first part is polled by the Tales system ("AutoIncludeInEventNode": true)

Pumpkin Patch.json

{
"ID": "Pumpkin Patch",
"Requirements": "Environment:Marsh, Level:3",
"Unique": false,
"AutoIncludeOnwards": true,
"AutoIncludeInEventNode": true,
"BackgroundGraphic": "",
"MainGraphic": "Pumpkin Patch",
"Title": "You come across a Pumpkin Patch",
"Narrative": "It's not further away from a wooden hut, so whoever lives in the hut is probably the owner of this patch.",
"Choice_1": "[Witch] 'Borrow' some Pumpkins",
"Choice_1_Requirements": "Class:Witch",
"Choice_1_Outcome": "There are plenty of pumpkins lying around, and they'll rot if left unused. At least that's what you decide to tell the owner if they caught you red handed.\n\nNone seems to notice though...",
"Choice_1_Reward": "RemoveChoice:All, Craft:Quality Pumpkin, Craft:Quality Pumpkin",
"Choice_1_ExecuteFunction": "",
"Choice_2": "Take a look around",
"Choice_2_Requirements": "",
"Choice_2_Outcome": "",
"Choice_2_Reward": "",
"Choice_2_ExecuteFunction": "Pumpkin Patch II"
}

This event will appear only on a 'Marsh' environment, after the player reaches level 3+.

We check if the character is a Witch. If so, the option to 'Borrow' two Quality Pumpkins is enabled.

Otherwise the player can move Onward (autoincluded) or Look Around. If they do look around we load the second file.

Pumpkin Patch II.json

{
"ID": "Pumpkin Patch II",
"Requirements": "",
"Unique": false,
"AutoIncludeOnwards": false,
"AutoIncludeInEventNode": false,
"BackgroundGraphic": "",
"MainGraphic": "Pumpkin Patch",
"Title": "You come across a Pumpkin Patch",
"Narrative": "There are plenty of pumpkins lying around, and they'll rot if left unused. But as you consider your course of action you hear an angry voice yelling at you.\n\n'Get out of my patch! Pumpkin thief!'",
"Choice_1": "Sorry, I didn't mean to trespass. I'll just leave now...",
"Choice_1_Requirements": "",
"Choice_1_Outcome": "'And stay out of my property!' She yells furiously as you get more distance between you.",
"Choice_1_Reward": "RemoveChoice:All",
"Choice_1_ExecuteFunction": "",
"Choice_2": "I go and do as I please old hag!",
"Choice_2_Requirements": "",
"Choice_2_Outcome": "You can tell she isn't pleased with your manners from an Astral Bolt passing a few inches from your head.",
"Choice_2_Reward": "Encounter:Mambo Acolyte - Lv 4, Encounter:Living Mushroom - Lv 3, Encounter:Living Mushroom - Lv 3, NextNode:Pumpkin Patch III",
"Choice_2_ExecuteFunction": ""
}

The witch will accuse the player of theft. If they play nice they can go away. Otherwise a rude response will lead to combat. The encounter is fixed an we fight against the witch and two living mushrooms. I could fetch a random retinue for her, but at this point this encounter feels more natural for the setting.

Now combat means the player will either win and live or die and game is over. So we only need a 'Victory' screen. We can safely turn the next node into a victory screen, as the only way for the player to visit that node is to actually live.

Pumpkin Patch III.json

{
"ID": "Pumpkin Patch III",
"Requirements": "",
"Unique": false,
"AutoIncludeOnwards": true,
"AutoIncludeInEventNode": false,
"BackgroundGraphic": "",
"MainGraphic": "Pumpkin Patch",
"Title": "Victory!",
"Narrative": "The Witch pose no real challenge and you prevail, but most of the pumpkins are now destroyed anyway.",
"Choice_1": "[Witch] Search the Witch's Hut",
"Choice_1_Requirements": "Class:Witch",
"Choice_1_Outcome": "You help yourself in anything useful you can find in her hut. She can no longer object.",
"Choice_1_Reward": "RemoveChoice:All, Invoke:Witch, Invoke:Herbs, Invoke:Herbs",
"Choice_1_ExecuteFunction": "",
"Choice_2": "Search the Witch's Hut",
"Choice_2_Requirements": "Not:Class:Witch",
"Choice_2_Outcome": "You search around in her hut but nothing feels particularly useful. Except perhaps a wooden chest in the east wall of the hut.",
"Choice_2_Reward": "RemoveChoice:All",
"Choice_2_ExecuteFunction": "Chest"
}

Here we are victorious, the pumpkins are gone but we can loot the Witch hut. Witches can find some more specialized treat. Whereas non witch characters can claim the contents of the chest.

And there you have it. Chaining of different "Tales" to create a simple & short choose your own adventure story.

The only thing you need to be careful, is to make sure that only the 1st part of your short story, aka the entry point (or entry points), can be polled by the event system.

That's why part 2 & 3 are both set as : "AutoIncludeInEventNode": false

Seems like a lot of typing but it's mostly copy - pasting. The structure of all event json files is fixed. And in this example I am always providing only 2 choices + an automatic 'Leave' option (in parts 1 & 3), which simplifies things even more and only the fields we care about need to be filled with content.
Creating Custom Stages & Adding them to Game Modes
Custom Stages 101
  • Each Stage Set is declared as a .json file and needs to be placed in ../Content/Stages or in ../Mods/[Your Mod]/Stages
  • Each Stage Set can contain up to 20 User Defined Stages, If the Game Mode contains more than 20 Stages, 21+ Stages will get procedurally generated
  • All .json files in the above folders will be loaded to the StagesDB, but will be used only if the Game Mode makes use of this Custom Set
  • You should always include ONLY one 'DungeonEntry' & 'Boss' nodes at Start & End of Stage
  • Killing a Boss is necessary in order to advance to the next Stage
  • Other nodes you can include are: Encounter, Elite, Camp, Intersection, CaveIntersection, BanditCampIntersection, DungeonIntersection, Town, Treasure, Event, Merchant or a Tale ID
  • Stage Nodes can have as value a Tale ID, the icon will appear as a questionmark but the chosen tale will trigger once visiting this node.
  • Since at this point the Environmental Graphics can't be changed it's advisable to use 'Intersection', and let the StageManager decide if this is a Cave, Bandit Camp or Dungeon
  • Inside the stages folder you'll find a CStageTemplate.json file to use as a template, you are free to add as many nodes you like in each of the 20 custom stages, and use as many of them as you like in your Game Mode. i.e You may only want to edit & use the 3 first. In this case you can leave the Stages 4 to 20 as they are, since they won't be used. But if your mod user decides to add extra stages in their run, nothing will break.

Adding your Custom Stages to a Game Mode
  • UseCustomStageSet:[Set name], if defined will use the Custom Stage Set named [Set name] instead of the vanilla procedurally generated Stages.
  • When using a 'CustomStageSet' in a game mode you should never set a 'StartingStageLength' and won't make much sense to set a 'StartingNode'.

Let's see an example:

I will create a json file called Mortal Combat.json and place it in ../Mods/Raven's Brew/Stages/, Raven's brew is simply my Mod name. You can replace it with your Mod Name.

First line is the ID which should match exactly the filename:

"ID": "Mortal Combat"

This is simply the name of the Stage Set. To use it specify in your game mode:

"UseCustomStageSet": "Mortal Combat"

Now your Game Mode and your Custom Stage Template are linked. That's all you need to do to connect them. Your Game Mode can otherwise modify your run as you see fit.

Continuing in my Stage template I need to specify 20 Stages. Simply copy paste the provided CStageTemplate.json from your Content/Stages folder and edit its values.

i.e
"Stage_1_Nodes":[
"DungeonEntry",
"*Prologue",
"*Thrown into the Arena",
"Elite",
"Elite",
"Elite",
"*Quartermaster",
"Elite",
"Elite",
"Elite",
"*A Moment of Peace",
"Elite",
"*Freedom is Near",
"Boss"
],

The entries marked with asterisk (you don't need the asterisk there, just to make them more visible here) are custom event id's. DungeonEntry & Boss should always be present in Start & End. And Elite is an Elite encounter.

And there you have it. Your own custom adventure!
Modding the Sandbox Mode
New Game Property: Sandbox
  • Any Game Mode can turned into Sandbox, but it's recommended to set Endless:true.
  • All Stage related settings (like Custom Stage Sets, Starting Stage etc...) are overriden by the Location json files so won't have any effect
  • But you can set about everything else: enemy related properties, all pc related properties, custom rules etc.
  • Added option to create Sandbox Game Modes in Game Mode Editor (under "How many stages to complete the run" => "Adventure Mode Sandbox")

Locations
  • Game modes will automatically use any defined locations if "Sandbox" mode is true
  • Each Map Location contents and properties are moddable through their location.json files but their spot in the map, ID & Location name can't be altered
  • It's not currently possible to add new locations in the map, only areas within the existing locations
  • For instance You can't change Lanmerih's position (or name) in the map, but you can create your own areas in Lanmerih and/or edit any existing ones.
  • Each location can have up to 10 Areas. Areas are like Stages but have some additional (moddable) properties
  • Location .json files are located in ../Content/Locations or ../Mods/[Your Mod]/Locations

Modding the Location Properties
  • LocationName & ID: should be left as is, eitherwise vanilla locations won't work
  • IsStartingLocation:true or false. Only one should be set as true. Make this Location the initial player location.
  • TravelDestinations [Destination]:[Means]:[Days] i.e "Grysbog:Land:2", Define which are travel destinations from our location, by which mean (Land or Sea), and how many days it will take. Traveling by land consumes Rations at the rate of 1 every 2 days. Traveling by sea consumes Fartings at the rate of 10 Farthing / every day of the trip.
  • HasTown: true or false. Determine whether the location has a settlement or not
  • TownName: [Town name]. The settlement name, doesn't have to match the location
  • AvailableActionTier: [Tier]. What actions tier can be found in Town, in turn also declares the settlement size (0-6)
  • Each location can have 10 different areas. Each area can have each own Stage either procedurally generated or with custom nodes. x Below can be for every field a number between 1 to 10. i.e x => 1 to declare the first area etc.
  • Area_x_GraphicSet: For now use one of the vanilla Stage Graphics Sets [Ice Cave, Bandit Camp, Dungeon, Infernal Cave, Meadow, Marsh, Plains, Beach, Arid Plains Camp, Arid Plains Shrine, Arid Plains, Snowcovered Forest, Snowcovered Ruins, Frozen Lake]
  • Area_x_Name: The name of the area
  • Area_x_isProcedural: true or false. Determine if the area is procedural or custom. Procedural stages never include a town node & may or may not include a boss as defined by Area_x_CompleteRequirements below.
  • Area_x_Length: If the are is procedural how many nodes it have?
  • Area_x_UnlockRequirements: a comma delimited Requirements string for the Area to show up. (Same options with the Tales System requirements) i.e Level:5, Class:Vampire. Area will be only available to level 5 vampire characters.
  • Area_x_CompleteRequirements: requirements to complete (a procedural stage). Can be "Boss", "Endgame" or "". If it's "" the stage won't generate a Boss at the final node. If it's 'Endgame' completing this stage will end/conclude the sandbox mode. "Endgame" setting in procedural stages will always spawn a Boss, but you can also use it non-procedural stages in case you won't something like an 'Epilogue'.At that point any bonus mastery & token rewards declared in the game mode are also awarded.
  • Area_x_isRepeatable: true or false. Whether are is repeatable or an one off adventure.
  • Area_x_MinEnemyTier: Min Enemy Tier
  • Area_x_MaxEnemyTier: Max Enemy Tier
  • The Base Enemy Max Level will be set temporarily to a value in between Min & Max Tiers. i.e 3 to 6, may set enemy Max level to 4 and the Boss to D4. Normal Enemies will then be level 1-4 while exploring this area. Next time you visit the same area can be different ie 1-3 and the Boss D3. etc.
  • Area_x_Nodes: A list of your custom nodes if the stage is not procedural. (Similar to how you declare stage nodes in Custom Stage Sets.)

Additions EA Build 0230
  • Exports & Imports, are string lists containing a locations exports & imports (should match the tags you have set in your commodities)
  • i.e Let's say we have 2 Commodities: Spice & Sugar
  • if in a location they are Imports ( "Imports":["Spice", "Sugar"], ) it means that they are not native, have to be imported thus are more expensive (up to 30% more) to obtain than normal
  • if in a location they are Exports ( "Exports":["Spice", "Sugar"], ) it means that they are in abudance, thus are cheaper to obtain than normal (down to 30% less)
  • This up to/down to 30% increase (or decrease) in the good price, replaces the normal fluctuation rate of (-20% to 20%)


Location Areas Modding Additions EA Build 0232
  • You can set Completion Rewards (Cards) for each Adventure Area using "Area_x_Rewards":["Cardname 1","Cardname 2", "etc"],
  • You can set a Cover Artwork for each Adventure Area using "Area_x_CoverArtwork":"ArtworkName"
  • You can set a Flavor Description for each Adventure Area using "Area_x_Description":"Short Description using \n to indicate new lines"

In-game Enviroments that can affect your Enemy, Event & Location Mods
  • The 'Environments' you can use in events & enemies are: Old Ruins, Destroyed Village, Dungeon, Forest, Marsh, Lake, Arid, Arctic, Infernal Gate, Urban.
ModManager Settings / Disabling Vanilla Content
It is possible to disable specific parts or the majority of the vanilla content. Perhaps for a total conversion mod.
  • There is a new panel in ModManager which lets you disable parts of the Vanilla Content i.e for a Total Conversion.
  • You can now disable certain Vanilla Content like Enemies, Perks, Races/Classes & their Card Sets, and Vanilla Game Modes
  • If you Disable the Enemies, any Unlocked Enemies Codex Entries you have will be lost, even if you Re-Enable them. You can then Unlock them once more.
  • You can also make the vanilla Portraits invisible in the Show All Portraits UI
  • ModManager settings are saved in Windows Registry, so that each individual Erannorth Installation can have its own settings
  • When Perks import fails Modding console will try to pinpoint the error further, by displaying the last successfully imported line
The Modder's Shell
The Modder's Shell is a poweful tool you can use in game to quickly test your mods and new cards.

Modder's Shell Commands
  • (Yes you can use it to cheat too)
  • You can toggle show/hide the Modders Shell by pressing F10
  • You can press the Up Arrow key to repeat the previous Command
  • Current Supported Commands:
  • CreateCard [Cardname], will create 1 copy of Cardname to the Players Hand
  • AddCard [Cardname], will add 1 copy of Cardname to the Players Deck or Inventory if it is Equipment
  • DefineCard [1 liner Card Definition], will create a new card & add it to the Action Database for the duration of the run
  • RemoveCard [Cardname], will remove Cardname from the Card Database (if this card is part of a tdb file just for the duration of the run)
  • EmptyDeck, will completely Empty the players Deck & Discard their Hand
  • ReshuffleAll, will force a Deck Reshuffle
  • ModifyPlayer[HP,AP,XP,Farthings,Rations,Order,Karma],x
  • i.e ModifyPlayerHP,3 will give player 3 HP
  • i.e ModifyPlayerRations,-1 will remove from player 1 ration
  • ModifyMastery[Mastery],x will modify the players Mastery
  • i.e ModifyMasteryHuman,4 will give +4 Human Mastery
  • This can be used for custom races & classes as well
  • It can also be used to Modify the player's tokens
  • i.e ModifyMasteryTokens,5 will give the player 5 tokens
  • CloneCard [Cardname], will retrieve the definition of Card with an included ReUseArtwork statement, to quickly edit and create a variant of Cardname.
  • StartEvent [Event ID], will fire up the event with ID = Event ID. i.e StartEvent Adventurer Corpse I
  • NextNode [Node], will set the upcoming Node of the Stage to [Node] or to [Event ID]. i.e NextNode Elite
  • JumpToNode [num], will set the current node index to [num] ie JumpToNode 1, will return player back to DungeonEntry
  • JumpToStage [num], will set the current stage index to [num] ie JumpToStage 3, will jump the player to Stage 3
  • Added support for ModifyPlayer[LP,PP,Strength,Agility,Resilience,Intellect,Willpower,Charisma]
  • KillAll: will kill all enemies in the node
  • TriggerAmbush, will convert an encounter into an Ambush encounter
  • ReDefine [One-liner Card Definition], will either define or replace the card with the same name name.
  • SmartCast [Cardname], will use Card Name on the optimal target among [First Enemy, First Ally or You] (as would right-clicking the card in your hand)
  • CreateEnemy [Enemy Name - Lv x], will spawn this Enemy in the battlefield if the Enemy/Level combination exist in the EnemyDB
  • You can manually Save the Game Progress using the Modder's Shell only when a character is active using: SaveProgress [Savename]
  • ie. SaveProgress Jonathan
  • You can manually Load a Game Progress using the Modder's Shell only in Main Menu with no character active using: LoadProgress [Savename]
  • ie. LoadProgress Jonathan
  • If you end up having too many you can find these saves and delete them manually in C:\Users\[Your Username]\AppData\LocalLow\Spyridon Thalassinos\Erannorth Reborn as they'll too sync with Steam Cloud
Staying Up to Date
Even though I update this guide frequently, some times I may forget it or give it a lower priority and take a long time to add in it the latest changes.

However I always post any and all changes related to Modding in each Build Patch Notes.

So the best way to ensure that your modding knowledge is up to date is by checking out regularly the latest patch notes and this guide from time to time to see if there are any new sections ;)

Have fun modding Erannorth Reborn, try to share your Mods with the community through the Nexus, and if you have any questions feel free to ask!
< >
7 Comments
Zirkumflex Jul 14 @ 2:28pm 
I know exactly what you mean by "less restrictions" ;)

Yeah I was looking on nexus, so far there are a couple of character mods/assets.

But Id prefer Steam workshop since its way more comfortable to upload and especially support the mods here.

Thank you very much for the quick answer.

Looking forward to it! ! :bpenguin:
Raven  [author] Jul 14 @ 2:21pm 
Hi, Zirkumflex! I really wish that at some point I won't have to make these guides myself :steamhappy:

I have workshop planned for a later date after everything else is nearly done.

However I would still recommend to Modders to use the Nexus instead, there is already an Erannorth Reborn section there. (And most will end up posting their mods there anyway, as it overall has less restrictions.)
Zirkumflex Jul 14 @ 2:09pm 
The first time I see a dev making his own mod guide on steam. I appreciate this! Thank you for the great work and the effort.

Just a quick question tho: will there be steam workshop support at some point?

I am intrigued into making mods for your game :)
Raven  [author] May 17 @ 11:59am 
Thanks! If you have any questions feel free to ask :)
Godwin May 17 @ 11:39am 
Wow really good guide, nice!
Raven  [author] Apr 24 @ 9:08pm 
Thank you :) Glad you enjoy the game!
Saskatchewan Pirate Apr 24 @ 5:09pm 
This is great! Thanks a lot for the write up. I'm enjoying the game so far and am looking forward to seeing what comes next!