from random import * from string import * from writeCardPagesGlobals import * import sys from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import letter from reportlab.lib.units import inch from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.platypus import Paragraph, Table, Frame, Image from distutils.text_file import TextFile from csvdata import CSVData from distutils import text_file from reportlab.lib.enums import * import reportlab.rl_config reportlab.rl_config.warnOnMissingFontGlyphs=0 from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont pdfmetrics.registerFont(TTFont('MythicPalace','MythicPalace.ttf')) pdfmetrics.registerFont(TTFont('Papyrus','Papyrus.ttf')) # ################################################################################################################### # ################################################################################################################### # ################################################################################################################### # ################################################################################################################### # Edit this function to adjust the composition of a booster pack. def boosterList(cardList): outputList=[] # 2 VC resources outputList += cardListFiltered(cardList,2,rarity="VC",type="r") # 1 R of any type outputList += cardListFiltered(cardList,1,rarity="R") # 3 UC of any type outputList += cardListFiltered(cardList,3,rarity="U") # 1 C creature outputList += cardListFiltered(cardList,1,rarity="C",type="c") # 1 C structure outputList += cardListFiltered(cardList,1,rarity="C",type="s") # 1 C item outputList += cardListFiltered(cardList,1,rarity="C",type="i") # 1 C event outputList += cardListFiltered(cardList,1,rarity="C",type="v") # 5 C of any type outputList += cardListFiltered(cardList,5,rarity="C") print "Built boosterList, %i cards." % len(outputList) return outputList # edit this function to adjust the composition of a starter deck def starterList(cardList): outputList=[] # 1 of each VC resource (7) outputList += cardListByNumber(cardList,[1,2,3,4,5,6,7]) # 20 of any VC resource outputList += cardListFiltered(cardList,20,rarity="VC",type="r") # 3 R of any type outputList += cardListFiltered(cardList,3,rarity="R") # 1 UC creature outputList += cardListFiltered(cardList,1,rarity="U",type="c") # 1 UC structure outputList += cardListFiltered(cardList,1,rarity="U",type="s") # 1 UC item outputList += cardListFiltered(cardList,1,rarity="U",type="i") # 1 UC event outputList += cardListFiltered(cardList,1,rarity="U",type="v") # 5 UC of any type outputList += cardListFiltered(cardList,5,rarity="U") # 7 C creature outputList += cardListFiltered(cardList,7,rarity="C",type="c") # 7 C structure outputList += cardListFiltered(cardList,7,rarity="C",type="s") # 6 C item outputList += cardListFiltered(cardList,6,rarity="C",type="i") # 6 C event outputList += cardListFiltered(cardList,6,rarity="C",type="v") # 1 C hero outputList += cardListFiltered(cardList,1,rarity="C",type="h") # 9 C any type outputList += cardListFiltered(cardList,9,rarity="C") print "Built starterList, %i cards." % len(outputList) return outputList def generateOutputList(cardList): outputList=[] #outputList += starterList(cardList) #outputList += boosterList(cardList) #outputList += boosterList(cardList) #outputList += boosterList(cardList) #outputList=cardList ## Print mega-booster for i in range(0,8): outputList += boosterList(cardList) print "Final output: %i cards." % len(outputList) return outputList # ################################################################################################################### # ################################################################################################################### # ################################################################################################################### # ################################################################################################################### class CharSVData(CSVData): def __init__(self, fileName, keyLine = 1, nameColumn = 1, separator=","): self.fileName = fileName text_file.TextFile.__init__(self, self.fileName) #save our separator character self.separator=separator rawData = self.readlines() self.numEntries = len(rawData) # Use the column descriptors as the dictionary keys. self.columnKey = rawData[keyLine].rstrip("\n").split(separator) self.name = self.columnKey[nameColumn] self.keyLine = keyLine self.filters = [[],[],[]] self.filtersOn = [False, False, False] # Build the dictionary self.BuildDictionary(rawData) # Set the starting index to whatever is the first valid vehicle entry self.index = 0 self.index = self.GetNextValidIndex(True) def BuildDictionary(self, rawData): self.data = {} for key in self.columnKey: key_index = self.columnKey.index(key) for line in rawData: line = line.rstrip("\n").split(self.separator) if not self.data.has_key(key): self.data[key] = [] try: self.data[key].append(line[key_index]) except: # There's a missing entry within the line. Fill it in with an empty string self.data[key].append("") class cardRecord: def __init__(self,number="",rarity="",type="",resource="",name="",strength="",muster="",victoryPoints="",art="",version="",ruleText="",flavorText=""): self.number=number self.rarity=rarity self.type=type self.resource=resource self.name=name self.strength=strength self.muster=muster self.victoryPoints=victoryPoints self.art=art self.version=version self.ruleText=ruleText self.flavorText=flavorText def getCards(filename): cardCSV=CharSVData(filename,0,4,"\t") cardList=[] cardCSV.SetIndex(0) for i in range(0,cardCSV.numEntries-1): newCard=cardRecord() newCard.number=cardCSV.GetData("number") newCard.rarity=cardCSV.GetData("rarity") newCard.type=cardCSV.GetData("type") newCard.resource=cardCSV.GetData("resource") newCard.name=cardCSV.GetData("name") newCard.strength=cardCSV.GetData("strength") newCard.muster=cardCSV.GetData("muster") newCard.victoryPoints=cardCSV.GetData("victorypoints") newCard.art=cardArtPath+cardCSV.GetData("art") newCard.version=cardCSV.GetData("version") newCard.ruleText=cardCSV.GetData("ruletext") newCard.flavorText=cardCSV.GetData("flavortext") cardList.append(newCard) cardCSV.IncrementIndex(True) return cardList def drawCardName(canvas,name): canvas.saveState() #canvas.setFont("Times-Roman",12) canvas.setFont("Papyrus",12) canvas.drawCentredString(inch,1.25*inch,name) canvas.restoreState() def drawCardNumber(canvas,number): canvas.saveState() canvas.setFont("Times-Roman",6) canvas.drawCentredString(1.0/8*inch,1.0/16*inch,number) canvas.restoreState() def drawCardRarity(canvas,rarity): canvas.saveState() canvas.setFont("Times-Roman",6) canvas.drawCentredString(5.0/16*inch,1.0/16*inch,rarity) canvas.restoreState() def drawCardOutline(canvas): canvas.saveState() # set up the correct line attributes canvas.setLineWidth(0.5) canvas.rect(0,0,2*inch,3.5*inch) canvas.restoreState() def drawCardVersion(canvas,version): canvas.saveState() canvas.setFont("Times-Roman",6) canvas.drawCentredString(inch,1.0/16*inch,version) canvas.restoreState() def drawCardVictoryPoints(canvas,victoryPoints): canvas.saveState() canvas.setFont("Times-Roman",12) canvas.drawCentredString(inch+.75*inch,1.0/16*inch,victoryPoints) canvas.restoreState() def drawCardType(canvas,type): canvas.saveState() canvas.setFont("MythicPalace",28) canvas.drawCentredString(1.75*inch,3.125*inch,type) canvas.restoreState() def drawCardResource(canvas,resource): canvas.saveState() canvas.setFont("MythicPalace",28) canvas.drawCentredString(1*inch,3.125*inch,resource) canvas.restoreState() def drawCardMuster(canvas,muster): canvas.saveState() canvas.setFont("MythicPalace",18) for i in range(0,len(muster)): canvas.drawCentredString(3.0/16*inch,1.5*inch+i*0.25*inch,muster[i]) canvas.restoreState() def drawCardArt(canvas,art): canvas.saveState() try: canvas.drawInlineImage(art,7.0/16*inch,1.5*inch,1.5*inch,1.5*inch) except: print "Warning: missing card art file \"%s\".\n" % art canvas.drawInlineImage(cardArtPath+cardDefaultArt,7.0/16*inch,1.5*inch,1.5*inch,1.5*inch) canvas.setLineWidth(1) canvas.rect(7.0/16*inch,1.5*inch,1.5*inch,1.5*inch) canvas.restoreState() def drawCardRuleText(canvas,ruleText): canvas.saveState() ruleText=strip(ruleText,"\"") ruleStyle=ParagraphStyle("RuleText",fontName="Times-Roman",fontSize=7,leading=7) ruleParagraph=Paragraph(ruleText,ruleStyle) w,h=ruleParagraph.wrap(1.5*inch,.5*inch) x=.25*inch y=1.1875*inch-h ruleParagraph.drawOn(canvas,x,y) canvas.restoreState() def drawCardFlavorText(canvas,flavorText): canvas.saveState() flavorText=strip(flavorText,"\"") flavorStyle=ParagraphStyle("FlavorStyle",fontName="Times-Roman",fontSize=5,leading=5,alignment=TA_CENTER) flavorText=""+flavorText+"" flavorParagraph=Paragraph(flavorText,flavorStyle) w,h=flavorParagraph.wrap(1.5*inch,.25*inch) x=.25*inch y=.625*inch-h flavorParagraph.drawOn(canvas,x,y) canvas.restoreState() def drawCardStrength(canvas,strength): canvas.saveState() canvas.setFont("Times-Roman",24) canvas.drawCentredString(3.0/16*inch,3.1875*inch,strength) canvas.restoreState() def drawCard(canvas,cardRecord): canvas.saveState() print "Drawing card: %s" % cardRecord.name #drawCardOutline(canvas) drawCardStrength(canvas,cardRecord.strength) drawCardName(canvas,cardRecord.name) drawCardNumber(canvas,cardRecord.number) drawCardRarity(canvas,cardRecord.rarity) drawCardVersion(canvas,cardRecord.version) drawCardVictoryPoints(canvas,cardRecord.victoryPoints) drawCardType(canvas,cardRecord.type) drawCardResource(canvas,cardRecord.resource) drawCardMuster(canvas,cardRecord.muster) drawCardArt(canvas,cardRecord.art) drawCardRuleText(canvas,cardRecord.ruleText) drawCardFlavorText(canvas,cardRecord.flavorText) canvas.restoreState() def drawCardPage(canvas,cardList): topRow=cardList[:5] bottomRow=cardList[5:] canvas.saveState() canvas.translate(8.5*inch,0) canvas.rotate(90) canvas.translate(.5*inch,26.0/32*inch) # this line is kludgy! canvas.translate(0,-0.125*inch) for card in bottomRow: drawCard(canvas,card) canvas.translate(2*inch,0) canvas.restoreState() canvas.saveState() canvas.translate(8.5*inch,0) canvas.rotate(90) # this line is kludgy! canvas.translate(0,-0.125*inch) canvas.translate(.5*inch,26.0/32*inch) canvas.translate(0,3.5*inch) for card in topRow: drawCard(canvas,card) canvas.translate(2*inch,0) canvas.restoreState() canvas.showPage() def drawCardSet(canvas,cardList): cardPages=[] #split cardlist into 10-card chunks, and put it into cardpages while cardList != []: cardPages.append(cardList[:10]) cardList=cardList[10:] for page in cardPages: drawCardPage(canvas,page) def cardListByRarity(cardList,rarity): outputList=[] for card in cardList: if card.rarity==rarity: outputList.append(card) #print "Built cardListByRarity, %i cards." % len(outputList) return outputList def cardListByNumber(cardList,numberList): outputList=[] for cardNum in numberList: for card in cardList: if card.number==str(cardNum): outputList.append(card) #print "Built cardListByNumber, %i cards." % len(outputList) return outputList def cardListByType(cardList,type): outputList=[] for card in cardList: if card.type==type: outputList.append(card) #print "Built cardListByType, %i cards." % len(outputList) return outputList def cardListFiltered(cardList,quantity,rarity=None,type=None): outputList=[] if rarity != None: cardList=cardListByRarity(cardList,rarity) if type != None: cardList=cardListByType(cardList,type) for i in range(1,quantity+1): outputList.append(choice(cardList)) #print "Built cardListFiltered, %i cards. Cards short: %i" % (len(outputList),quantity-len(outputList)) return outputList def __main__(): cardList=getCards(cardDatabaseFilename) c=canvas.Canvas(outputFilename, pagesize=letter) drawCardSet(c,generateOutputList(cardList)) c.save() __main__()