Skip to content

Extending the editor

Creating new card effects

The kit includes a collection of default card effects:

  • Increase player stat: It increases the stat of the target player by a given amount and for a given duration.
  • Decrease player stat: It decreases the stat of the target player by a given amount and for a given duration.
  • Set player stat: It sets the stat of the target player to a given value.
  • Reset player stat: It resets the stat of the target player to its original value.
  • Increase card stat: It increases the stat of the target card by a given amount and for a given duration.
  • Decrease card stat: It decreases the stat of the target card by a given amount and for a given duration.
  • Set card stat: It sets the stat of the target card to a given value.
  • Reset card stat: It resets the stat of the target card to its original value.
  • Add keyword: It adds a given keyword to the target card.
  • Remove keyword: It removes a given keyword from the target card.
  • Move card effect: It moves the target card to another game zone.

It is possible to create your own custom effects in a very convenient way and the editor will pick them up automatically and make them available in the effects dropwdown without you having to write any additional code to do so.

If you want to create a new effect, you will first need to decide if it is a player effect (i.e., it targets a player or group of players) or a card effect (i.e., it targets a card or group of cards).

Let's take the increase player stat effect as a reference on player effects:

[PlayerTarget]
public class IncreasePlayerStatEffect : PlayerEffect
{
    [PlayerStatField("Player stat")]
    [Order(1)]
    public int statId;

    [ValueField("Value")]
    [Order(2)]
    public Value value;

    [IntField("Duration")]
    [Order(3)]
    public int duration;

    public override void Resolve(GameState state, PlayerInfo player)
    {
        var modifier = new Modifier(value.GetValue(state, player), duration);
        player.stats[statId].AddModifier(modifier);
    }
}

And the decrease card effect as a reference on card effects:

[CardTarget]
public class DecreaseCardStatEffect : CardStatEffect
{
    [ValueField("Value")]
    [Order(4)]
    public Value value;

    [IntField("Duration")]
    [Order(5)]
    public int duration;

    public override void Resolve(GameState state, RuntimeCard card)
    {
        var modifier = new Modifier(-value.GetValue(state, card.ownerPlayer), duration);
        card.stats[statId].AddModifier(modifier);
    }
}

As you can see, there are several useful base classes for effects:

  • PlayerEffect: The base class for player effects.
  • CardEffect: The base class for card effects.
  • CardStatEffect: An utility base class for card stat effects.

And several useful attributes for effect fields:

  • Order: It allows you to determine the rendering order of the field in the visual editor.
  • IntField: Used for integer fields.
  • EnumField: Used for enum fields.
  • ValueField: Used for value fields.
  • PlayerStatField: Used for player stat fields.
  • CardTypeField: Used for card type fields.
  • CardStatField: Used for card stat fields.
  • KeywordTypeField: Used for keyword type fields.
  • KeywordValueField: Used for keyword value fields.
  • GameZoneField: Used for game zone fields.

These attributes allow you to dynamically access the general settings you have defined for your game (like stats or zones) without writing any additional code. This is how the previous player effect looks like in the editor:

The actual logic of the effects happens in the Resolve method, with the following signature for player effects:

public override void Resolve(GameState state, PlayerInfo player)
{
    // ...
}

And the following signature for card effects:

public override void Resolve(GameState state, RuntimeCard card)
{
    // ...
}