Draftmancer Custom Card List Format

  1. Cube
  2. Advanced Card Specification
  3. Slots
  4. Settings
  5. Pack Layouts
  6. Custom Cards

Cube

The simplest Custom Card List is a list of card names, one per line (see Advanced Card Specification). This will define a Cube, meaning packs will be composed of 15 (configurable) random cards from the list without replacement and without regards for their rarity.

Pack collation can be further customized by specifying Slots and Layouts (see below).

Note: Using a Custom Card List disables the following options: Restrict to Collection, Maximum rarity, Maximum duplicate copies and Foil.

Advanced Card Specification

Full syntax for a card line is inspired by the Arena Import/Export format and is defined as follows:
[Count] CardName [(Set) [CollectorNumber]]
All parameters between brackets ([]) are optional, only the card name is required.

Examples

The four following lines are equivalent and will add one copy of 'Incubation Druid' from Ravnica Allegiance. Here the set and collector number are both redundant as there's only one printing of the card (in Arena, and as of May 2020 :)):
1 Incubation Druid (RNA) 131
1 Incubation Druid (RNA)
1 Incubation Druid
Incubation Druid
This will add 8 copies of the full art "Unset" Forest:
8 Forest (ANA) 60
This will add one copy of each of the two version (#243 & #244) of the Azorius Guildgate of RNA:
1 Azorius Guildgate (RNA) 243
1 Azorius Guildgate (RNA) 244

Slots

If you want more control over your booster, like a custom 'rarity' distribution, you can use the following format:
[SlotName(CardsPerBooster)]
Card Name 1
Card Name 2
...
[Slot2Name(CardsPerBooster)]
Card Name 3
Card Name 4
...
Each slot will be present in each booster. For example:
[Common(10)]
Card Name 1
Card Name 2
...
[Uncommon(3)]
Card Name 3
Card Name 4
...
[Rare(1)]
Card Name 5
Card Name 6
...
Will mimic the distribution of a standard Magic booster, except for the 1/8 Mythic/Rare ratio. Cards in the 'Common' slot don't have to be 'real' commons! Why not add a special planeswalker slot in each of your booster instead of one of the commons, everyone loved them in WAR right? :D
[Planewalker(1)]
Planewalker Card Name 1
Planewalker Card Name 2
...
[Common(9)]
Card Name 1
Card Name 2
...
[Uncommon(3)]
Card Name 3
Card Name 4
...
[Rare(1)]
Card Name 5
Card Name 6
...
Color balancing (if enabled) will be used only on the largest slot (in terms of cards per booster) and if it consist of at least 5 cards per booster. In both previous examples, the 'Common' slot will be color balanced if the option is enabled (which is the default value).

Settings

Before slots, you can declare a Settings block followed by a JSON object to control some global behaviors of your list.

[Settings]
{
	"settingName": "value",
	"anotherSetting": 125
}
				

Here are the possible settings with their description:

{
	name: string;                       // The name of your cube.
	cardBack: string;                   // URL to a custom card back.
	cardTitleHeightFactor: number;      // Allows you to adjust the height of the card title when stacked in a column. Defaults to 1.
	duplicateProtection: boolean;       // Enable or disable Duplicate Protection within a booster (defaults to true).
	showSlots: boolean;                 // If layouts are used, will display what sheet slot generated which card.
	
	// The following properties provide default values for some session settings, applied when the list is uploaded.
	// They can still be overridden by the user via the UI.
	boostersPerPlayer: number;          // Specify the default value of the "boostersPerPlayer" session setting.
	withReplacement: boolean;           // Specify the default value of the "withReplacement" session setting.
	colorBalance: boolean;              // Specify the default value of the "colorBalance" session setting.

	boosterSettings: {picks: number | number[], burns: number | number[]}[]; // Allows you to customize some settings on a per booster basis.
	// Example:
	"boosterSettings": [
		{
			"picks": 1,
			"burns": 14
		}, 
		{
			"picks": [2, 1], // Simulate the "Double Masters mode", with 2 picks right after openning the booster, then 1.
			"burns": 0
		}, 
		{
			"picks": [3, 2, 1], // For booster #3: pick 3 and burn 1, then pick 2 burn 0 and finally pick 1 burn 0 until the pack is empty.
			"burns": [1, 0]
		}
	]

	layouts: Record<string, PackLayout>; // See below

	// Specify the exact order of the pack layouts rather than picking them randomly, useful for block drafts. 
	//   Array of layout names, array of arrays of layout names (weights inherited from the layout declaration) 
	//   or array of Record<string, number> to override the weights.
	predeterminedLayouts: string[] | string[][] | Record<string, number>[];
	// Examples:
	"predeterminedLayouts": ["SheetA", "SheetB", "SheetC"],
	"predeterminedLayouts": [["Set1_Rare", "Set1_Mythic"], ["Set2_Rare", "Set2_Mythic"]]
	"predeterminedLayouts": [{"Set1_Rare": 7, "Set1_Mythic": 1}, {"Set2_Rare": 7, "Set2_Mythic": 1}]

	// Specify if the layouts are randomly picked with or without replacement (default: true).
	layoutWithReplacement: boolean;    
}

Pack Layouts

For even more control, you can specify multiple Pack Layouts describing variations of a pack, each with an associated weight (or probability to be chosen). Important Note: When using pack layouts, slots should be declared without a CardsPerBooster parameter.

As part of the [Settings] header, the syntax of a layout is as follow:

"layouts": {
	"LayoutName" : {
		"weight": 1,
		"slots": {
  			"SlotName1": 7,
 			"SlotName2": 3
		}
	}
}

Where Weight is an integer specifying how often this layout will be chosen when generating a pack. In this example, each pack will contain 7 cards picked from SlotName1 (user defined card list) and 3 cards picked from SlotName2 .

Example implementing a mythic rarity:

[Settings]
{
	"layouts": {
		"Rare": {
			"weight": 7,
			"slots": {
  				"Common": 10,
  				"Uncommon": 3,
  				"Rare": 1
			}
		},
		"Mythic": {
			"weight": 1,
			"slots": {
  				"Common": 10,
  				"Uncommon": 3,
  				"Mythic": 1
			}
		}
	}
}
[Common]
..Card List..
[Uncommon]
..Card List..
[Rare]
..Card List..
[Mythic]
..Card List..

More complex example mimicking the collation of Dominaria United (Exactly one legendary creature of varying rarity in each pack):

[Settings]
{
	"name": "Dominaria United",
	"withReplacement": true,
	"layouts": {
		"Rare": {
			"weight": 21,
			"slots": {
  				"Common": 10,
  				"Uncommon": 2,
				"UncommonLegendary": 1,
  				"Rare": 1
			}
		},
		"Mythic": {
			"weight": 3,
			"slots": {
  				"Common": 10,
  				"Uncommon": 2,
				"UncommonLegendary": 1,
  				"Mythic": 1
			}
		},
		"RareLegendary": {
			"weight": 7,
			"slots": {
  				"Common": 10,
  				"Uncommon": 3,
				"RareLegendary": 1
			}
		},
		"MythicLegendary": {
			"weight": 1,
			"slots": {
  				"Common": 10,
  				"Uncommon": 3,
				"MythicLegendary": 1
			}
		}
	}
}
[Common]
..List of all non-Legendary Creature Commons..
[Uncommon]
..List of all non-Legendary Creature Uncommons..
[Rare]
..List of all non-Legendary Creature Rares..
[Mythic]
..List of all non-Legendary Creature Mythics..
[UncommonLegendary]
..List of all Uncommon Legendary Creatures..
[RareLegendary]
..List of all Rare Legendary Creatures..
[MythicLegendary]
..List of all Mythic Legendary Creatures..

Custom Cards

A cube can also be composed of user-defined cards specified as JSON data. The CustomCards section must be the first one in the file. Once defined in this section, custom cards can be refered to by name in slots, just like regular cards.
[CustomCards]
[
	{	
		"name": "My 1st Custom Card",
		"rarity": "mythic",
		"mana_cost": "{2}{W}{W}",
		"type": "Legendary Creature",
		"subtypes": [
			"God"
		],
		"image_uris": {
			"en": "https://domain.com/URL/to/image.png"
		}
	},	
	{	
		"name": "My 2nd Custom Card",
		"mana_cost": "{W/B}{G}",
		"type": "Instant",
		"image_uris": {
			"en": "https://domain.com/URL/to/image2.png",
			"fr": "https://domain.com/URL/to/image2_fr.png"
		},
		"printed_names": {
			"en": "My 2nd Custom Card",
			"fr": "Ma deuxième carte personnalisée"
		},
		"back": {
			"name": "Back of my 2nd Custom Card",
			"printed_names": {
				"en": "Back of my 2nd Custom Card",
				"fr": "Dos de ma deuxième carte personnalisée"
			},
			"image_uris": {
				"en": "https://domain.com/URL/to/image2_back.png"
				"fr": "https://domain.com/URL/to/image2_back_fr.png"
			},
			"type": "Land",
			"subtypes": [
				"Forest"
			]
		}
	}
]
[MainSlot(15)]
4 My 1st Custom Card
4 My 2nd Custom Card
... Standard Card List ...

You can define multiple printings of the same card by varying the set and/or the collector number while keeping the name. Referring to these cards by name only (without specifying a set and a collector number) will always mean the first occurence. Duplicate cards by name will inherit all the properties of the first occurence, meaning that besides the name you only have specify the properties that are actually modified in the other printings. In the following example, only the first 'Nazgûl' has all the properties, the other ones will be completed automatically. Note how you can now refer to individual printings using the 'CardName (SET) Number' syntax.

[Settings]
{ "withReplacement": true } 
[CustomCards]
[
	{
		"name": "Nazgûl",
		"rarity": "uncommon",
		"mana_cost": "2B",
		"set": "ltr",
		"collector_number": "100", 
		"type": "Creature",
		"image_uris": {
			"en": "https://cards.scryfall.io/large/front/8/3/833936c6-9381-4c0b-a81c-4a938be95040.jpg?1686968640"
		}
	},
	{
		"name": "Nazgûl",
		"collector_number": "332",
		"image_uris": {
			"en": "https://cards.scryfall.io/large/front/c/e/ce65226a-12cd-416a-bb60-12e9b35f609b.jpg?1686971256"
		}
	},
	{
		"name": "Nazgûl",
		"collector_number": "333",
		"image_uris": {
			"en": "https://cards.scryfall.io/large/front/6/9/69b32f90-b32f-41a6-af0c-1c967ec49b73.jpg?1686971268"
		},
	},
	{
		"name": "Card related to Nazgûl somehow",
		"rarity": "uncommon",
		"mana_cost": "",
		"type": "Emblem",
		"image_uris": {
			"en": "https://cards.scryfall.io/large/front/7/2/7215460e-8c06-47d0-94e5-d1832d0218af.jpg?1688215133"
		},
		"related_cards": [
			"Nazgûl",
			"Nazgûl (LTR) 100",
			"Nazgûl (LTR) 332",
			"Nazgûl (LTR) 333"
		]
	}
]
[DefaultSlot]
Nazgûl
Nazgûl (LTR) 100
Nazgûl (LTR) 332
Nazgûl (LTR) 333
Card related to Nazgûl somehow

Full Card specification ('?' denotes an optional field):

CardFace {
	name: string;
	image_uris: { [lang: string]: URL };
	type: string;
	printed_names?: { [lang: string]: string };
	subtypes?: Array<string>;
}

CustomCard {
	name: string;
	mana_cost: string;
	type: string;
	image_uris: { [lang: string]: URL };
	printed_names?: { [lang: string]: string };
	colors?: Array<"W" | "U" | "B" | "R" | "G">;
	set?: string;	
	collector_number?: string;
	rarity?: string;
	subtypes?: Array<string> = [];
	rating?: number = 0; // A rating of the strength of the card in a vacuum, between 0 and 5. This may help bots navigate drafts when they don't know any cards :^)
	layout?: string;
	back?: CardFace;
	related_cards?: Array<CardID | CardFace>; // You can use this field to display some related cards when right clicking on the card. CardID can be the name of another custom card, or a Scryfall ID.
	draft_effects?: Array<DraftEffect>; // See the list of valid effects bellow.
	foil?: boolean; // Override the default finish of the card
}
The mana cost field follows Scryfall Symbology (e.g. "{5}{G}{G}"). The image_uris and printed_names fields are objects with the language as key and the localized image URL or name as value (see previous example).

Draft Effects

You can apply some effects from Conspiracy cards to your custom cards using the draft_effects field. Here are the implemented effects:
// On pick effects:
FaceUp              // Reveal the card to other players and mark the card as face up. Important note: Necessary for most 'UsableEffects" to function correctly!.
Reveal              // Reveal the card to other players
NotePassingPlayer   // Note the previous player's name on the card.
NoteDraftedCards    // Note the number of cards drafted this round, including this card.
ChooseColors        // Note colors chosen by your neighbors and you.
AetherSearcher      // Reveal and note the next drafted card.
CanalDredger        // The last card of each booster is passed to you.
ArchdemonOfPaliano  // Pick the next 3 cards randomly.
// Optional on pick effects:
LoreSeeker          // "You may add a booster pack to the draft".
// Usable effects (when the card is already in the player's pool):
RemoveDraftCard     // Remove the picked card(s) from the draft and associate them with the card.
CogworkLibrarian    // Replace this card in a pack for an additional pick.
AgentOfAcquisitions // Pick the whole booster, skip until next round.
LeovoldsOperative   // Pick an additional card, skip the next booster.
NoteCardName        // Note the picked card's name on the card.
NoteCreatureName    // Note the picked creature's name on the card.
NoteCreatureTypes   // Note the picked creature's types on the card.
// Other:
TrackRemovedCardsNames     // Will display the names of cards removed by the 'RemoveDraftCard' effect.
TrackRemovedCardsSubtypes  // Will display the unique subtypes of cards removed by the 'RemoveDraftCard' effect.
CogworkGrinder             // Will display the number of cards removed by the 'RemoveDraftCard' effect.

// Example value for Cogwork Librarian
"draft_effects": [
	"FaceUp",
	"CogworkLibrarian"
]

// The following effects are custom and do not match official Conspiracy effects.
AddCards            // Adds additional cards to your draft pool.

// Example value for AddCards
"draft_effects": [
	{
		"type": "AddCards",
		"count": 1, // Optional, if omitted, all cards from the following array will be added. Otherwise, 'count' random cards will be added to your pool.
		"cards": ["Card Name 1", "Card Name 2"...]
	}
]
Please note that only the combinations of effects found on actual Conspiracy cards are officially supported, some might not work as intended! See the list of supported official cards on this page of the GitHub wiki .