I recently changed my broadband supplier. As such, PyDraft is not currently available for download, and the PyDraft server is offline. I will re-upload PyDraft to another location soon.
PyDraft is now available again, and has a running server. I will update this page with details RealSoonNow.
In more detail - PyDraft is a suite of Python programs designed to run MagicTheGathering booster drafts between participants who are not necessarily online at the same time (hence Asynchronous), provided they are willing to trust each other not to deliberately cheat (hence Trust-Based).
As a Python-based project, PyDraft should work on any system which has a Python 2.5 (or later) distribution available - see [the Python homepage] for more information. PyDraft has been verified to work on the follwoing platforms:
Windows XP, Vista
Ubuntu (requires patch - ask me)
add yours here
PyDraft has been verified not to work (yet!) on the following platforms:
Windows CE
The current version of PyDraft is v0.5. Download it [here] (470 kb)! You will need to install Python to run PyDraft - get it from [the Python homepage]. Installation instructions and manual are contained in readme.html, which is also viewable [here]. More readable examples of drafting using PyDraft are viewable [here].
Version 0.5 adds support for draft Bots - documentation to come. It also fixes a couple of minor bugs in SetParse.py and with server support.
You can upgrade from v0.4 to v0.5. Download the [patch package], and extract it over your current install.
v0.4 changed the way PyDraft understands expansions. Any expansions added prior to v0.4 with SetParse.py will not be understood by versions of PyDraft from v0.4 onwards. You should remove any such expansions, and re-add them using SetParse.py once you have upgraded to v0.4 or later.
(You can determine your version of PyDraft by checking the file changelog.txt - the top-most version number corresponds to your version. Alternatively, you can run "pydraft.py -v". If changelog.txt is missing or "pydraft.py -v" fails, we recommend downloading the entire package).
At present, PyDraft understands the following sets:
RAV : Ravnica: City of Guilds
GPT : Guildpact
DIS : Dissension
TSP : Time Spiral
PLC : Planar Chaos
FUT : Future Sight
10E : Tenth Edition
LRW : Lorwyn
MOR : Morningtide
SHM : Shadowmoor
EVE : Eventide
ALA : Shards of Alara
CUB : Cuboid (that is, boosters distributed from the cardlist from the [Cube], but without any enforcement of uniqueness of cards throughout the draft)
Comments? Questions? Feature Requests? Post here!
Where can I see what I've already picked? --Vitenka
In your PyDraft installation directory there'll be a file called _VE-_VE-_VE1.dft, or something similar. This is a list of the picks you've made. If it's for a set you're not that familiar with, then you may want to also consult the Verdia.txt file in the expansions directory and maintain a separate list containing all the details you want (e.g. the full card text). _VE-_VE-_VE1.dft is read-only, and for good reason - don't edit it directly. --AlexChurchill
Somewhat non-obvious, but exactly what I was looking for. (And I'm tempted to wonder what happens if I change who it thinks I'm sat next to...) --Vitenka
It gets horribly confused (it'll send your picks to the wrong person) in a probably non-recoverable way - don't do it. --CH
Idea: Reject Rare Draft. I'm imagining that you would just write up a card list of 45 cards, no duplicates, and the client looks through the list of other sets to determine what the cards do (or at least include the expansion code for each card--anything more, such as writing out the full card text for every card, would make it too difficult to create your rare lists). --SadisticMystic
That could be made to work, I think. I think you'd have REJ as a special "set-code" that, when present on a Magic string, indicated "each card that follows will have its own set code attached. You cannot read this booster until you understand each of those sets". Then we should indeed be able to fairly easily parse a list of 45 "code : name" lines and shuffle them to produce your boosters. You could even have the ability to parse more than 45 lines, and pick a random 45. --CH
On the other hand, as Alex and I realised, that method would allow a player to naughtily seed their 45 "rejects" with one or two powerful cards, knowing they'll get first crack at them. Part of Reject Rare Drafting should be having no idea what's in your boosters (and, potentially, the card pool), which requires synchronising the pool of rejects before drafting. How to do so intelligently is tricky. --CH
Of course, anyone willing to cheat like this probably fails the "trust-based" criterion anyway. --AC
It'd be nice if shuffler.py provided a way to reshuffle the whole deck for a new game. Currently that seems to be "exit, delete the .pck file, restart", which is a bit laborious. --AC
I've discovered the "delete the .pck file" step isn't needed. --AC
There are assorted circumstances, actually, where dealing out one big deck to form the boosters for all players would be nice. Cube, Reject Rare, and Agricola are some examples. It'd be nice to find a way to do this. This could be restricted to online drafts if that helps. --AC
Draft bots. It'd be easy to make the main PyDraft executable importable, in which case it'd also be easy to build a bot API on top. You'd then be able to write a picking function in another .py file, import the API, and set it going. If they proved half-decent, you could bulk out 8-person drafts with them.
In particular, a simple algorithm would be - manually rate each card in the set out of 10 (in a vacuum - so first-pack-first-pick). When you get a pack, choose randomly based on the rating of the cards (so, if the pack contains just a 9 and a 1, pick the 9 90% of the time). But first, weight up each card by, say, 10% of the raw value of each card already picked that shares a colour, and down by, say, abs(3.5-CMC)% of the raw value of each card already picked that shares the CMC.
Feature Request: When it says "Boosters are at..." (when waiting for boosters and you wonder who has them) it says who has them, and which way they are passing. Could it also, at that point, recap the seating order? I have no idea who is to my right. --Vitenka
Agreed. Shouldn't be too hard to knock up, either. --CH
Could have an ascii-art table with everyone's name by their seat? --qqzm
Um, ibble. There's no bound on the number of drafters, either upper or lower. That means I need to dynamically work out how large / what shape to draw the table each time. Although I suppose I could always have a rectangular table, with half the drafters on the top edge and half on the bottom edge... --CH
Yeah, that's exactly what I'd imagined, which shouldn't be too hard. Isn't there an upper bound of 15? As after that you'd split into multiple separate drafts... --qqzm
Well, yes. But I don't enforce it. Anyway, how's this?
The seating order is:
3 2 1
Alex Stuart Max
+--------------------+
| |
| |
| |
| |
+--------------------+
Vitenka Chris Alan
4 5 6
Looks good. I don't think you need the seat numbers though (and they are slightly confusing given that you don't use the standard numbering). --qqzm Players seeking games:
ChrisHowlett would gladly do some drafting, preferably triple-Shards.
AC would be up for triple-ALA, SHM-SHM-EVE, or probably other formats, from 10th October onwards.
Planned Changes
Seating order display, as above
Query card by name and set-code function (no guarantees of user-friendliness)
Support for News pushed from the server (motivation here is that I may be changing ISP)
Support for "Magic 2010" style core sets
Reject Rare Draft support
Possibly password protect draft creators
Determine changes needed for Python 3.0 compatability