Skip to content

Add Canadian Highlander format - #12522

Open
MostCromulent wants to merge 1 commit into
Card-Forge:masterfrom
MostCromulent:canadian-highlander
Open

MostCromulent wants to merge 1 commit into
Card-Forge:masterfrom
MostCromulent:canadian-highlander

Conversation

@MostCromulent

Copy link
Copy Markdown
Contributor

Summary

Adds Canadian Highlander as a Casual format, with its singleton, 100-card and 10-point rules checked wherever Forge checks a deck against a format, and the deck's points total shown in the deck editor.

Implementation

  • New format file keys: Singleton, MinDeckSize, MaxPoints, Points:Card=N; … and CardPool:<format>. The deck rules are held in an immutable GameFormat.DeckRules record passed through the constructor. Existing formats get DeckRules.NONE and behave as before.
  • CardPool takes the named format's sets, rarities, additional cards and ban list, adding the format's own bans on top. The reader builds these formats after every file is read, since files load in no fixed order.
  • GameFormat's deck check applies the new rules, so isDeckLegal, getDeckConformanceProblem and the deck table's format column all see them. Copies and points count by card name across the whole deck. With Unify Constructed format selection in the lobby and deck editor #12521, choosing the format in the lobby checks every deck against these rules at match start.
  • The points list is taken from canadianhighlander.ca (updated 1 September 2026).
  • DeckStatistics.pointsSummary builds the readout, for example "Canadian Highlander points: 7 / 10", for the desktop Statistics panel and the mobile deck stats screen.
  • New and existing legality messages in GameFormat use en-US localisation keys.

Why this is architecturally consistent

  • Card pool rules already live in format files read by GameFormat, so the deck rules go there too.
  • Commander already enforces singleton, but through DeckFormat, whose copy limit is fixed per game type. Canadian Highlander is played in the Constructed game type, whose DeckFormat allows 4 copies, so a format file needs its own Singleton rule. It reuses DeckFormat's exemptions for basic lands, cards like Relentless Rats and cards with a set limit.
  • CardPool:Vintage removes a maintenance burden. Copying Vintage's Sets and Banned lines would mean updating Canadian Highlander's file by hand for every new set and every Vintage ban change; referencing Vintage keeps one list to maintain.

🤖 Generated with Claude Code

…ules

Format files can now set Singleton, MinDeckSize, MaxPoints and a Points
list, and can take another format's card pool with CardPool. GameFormat's
deck check applies the new rules, so every place that checks a deck
against a format sees them. Copies and points count by card name, and
cards that allow any number of copies keep their exemption.

Canadian Highlander takes Vintage's card pool and ban list and uses the
points list from canadianhighlander.ca, updated 1 September 2026. The
deck editor's statistics show the deck's points total on desktop and
mobile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MostCromulent

MostCromulent commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor Author

Intended for merging after #12521 so you get deck filtering and legality enforcement for free in the lobby and at match start, but really could go in either order.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant