magefree / mage

Magic Another Game Engine
http://xmage.today
MIT License
1.91k stars 778 forks source link

New Format: Conquest #12876

Open Zunon opened 2 months ago

Zunon commented 2 months ago

I would like to propose adding support for the Conquest format in XMage. Conquest is a community-run Commander variant focused on competitive balance and variety of viable strategies.Implementing Conquest in XMage would provide players with more variety and attract those interested in this emerging format.

Detailed Description

Overview of Conquest

Conquest is a singleton format similar to Commander but with key differences that create a fresh gameplay environment:

Card Legality

Comparison with Commander

Please let me know if there are any questions or if further information is needed. Thank you for considering this proposal!

xenohedron commented 2 months ago

Thanks for the detailed writeup.

For workaround at present time, there is a "Freeform Unlimited Commander" that could accommodate some of this functionality. It removes the deck size requirement and ban list and allows any card(s) as commander. Custom Options can override starting life. You would need to manually concede on 12 commander damage, trust singleton and ban list to the honor system, and you wouldn't get the scry rule.

Additional coding needed for full support:

Custom options that don't yet exist:

I do think this would not be too difficult to implement as a new game mode.

risgovin commented 2 months ago

thanks @xenohedron for the clarification of current available work arounds.

as for implementing as a new gamemode, I took some time looking at GameCommanderImpl.java (and thusly the commander damage watcher etc).

I am certain that everything but the scry rule is already easily doable. a few open questions I had regarding implementing the scry rule specifically are the following: 1) endMulligan() would be the proper override to implement this functionality, is that right? 2) is there a way to get the player's "seat number"/"turn order" in said function? (I did see some references to startingPlayerId in the code base)

xenohedron commented 2 months ago
  1. endMulligan() is fired per player after that player keeps their hand. I don't think it's actually used by anything else. It can certainly work for the core functionality, but if one player takes fewer mulligans than another, I think they would end up scrying before all mulligans complete. If you want it to be synchronous after all mulligans complete, then better to override executeMulliganPhase(), call the super and then do the scrying, like VancouverMulligan. Assuming you're fine with Conquest always using London, can extend LondonMulligan and no other overrides should be needed.

  2. game.getState().getPlayerList(game.getStartingPlayerId()) will return the players in turn order.