import os import re from mtg import * class Database: def getCard(self, name): pass def findCard(self, name): pass """ Text file database class Loads the card database files found at http://www.yawgatog.com/resources/oracle/ """ class TextDB(Database): def __init__(self, filename): self.filename = filename def getCard(self, name): return self.findCard(name).next() def findCard(self, name=None): card = None with open(self.filename, 'r') as f: inRecord = False recordName = False for line in f: line = line.strip() if not inRecord: recordName = line inRecord = True if not name or recordName.lower() == name.lower(): card = { 'name': recordName, 'type': '', 'attributes': [], 'cost': '', 'power': 0, 'toughness': 0, 'rarity': None, 'text': [], } elif card and line: # Load the data into the card if not card['cost'] and re.match('^X?\d*[{0}]*$'.format(' '.join(Mana.types.keys())), line): card['cost'] = line continue elif not card['type']: attributes = line.split(' -- ') type = attributes.pop(0) card['type'] = type card['attributes'] = attributes elif not card['power'] and not card['toughness'] and re.match('^\d+([+-]?\*)?\/\d+([+-]?\*)?$', line): (card['power'], card['toughness']) = line.split('/') elif re.match('^([A-Z0-9]+-[{0}](, )?)+$'.format(''.join(Card.rarities.keys())), line): info = line.split(', ') card['sets'] = [i.split('-').pop(0) for i in info] currentSet = info.pop() card['rarity'] = currentSet.split('-').pop() else: # Ability text card['text'].append(line) elif not line: # Finished with current record if card: # We're done here yield Card(card['name'], card['type'], card['attributes'], card['cost'], card['power'], card['toughness'], card['sets'], card['rarity'], card['text']) # Prepare to read in the next record inRecord = False class WagicDB(Database): def __init__(self, wagicPath): self.path = wagicPath self.db = {} self.loadDb() def loadDb(self): for root, dirs, files in os.walk(self.path + '/Res/sets'): if '_cards.dat' not in files: continue set = root.split('/')[-1] with open(root + '/_cards.dat', 'r') as f: for line in f: if not line.startswith('primitive='): continue primitive = line.split('=')[1].strip() if not primitive in self.db.keys(): self.db[primitive] = [] self.db[primitive].append(set) def getCard(self, name, baseCard): card = baseCard unsupported = [set for set in card.sets if set not in self.db[card.name]] #if unsupported: # print '{0}: Unsupported sets: {1}'.format(card.name, unsupported) supported = [set for set in card.sets if set in self.db[card.name]] card.sets = supported return card if __name__ == '__main__': db = TextDB('db.txt') deck = Deck() deck.load('decks/BlackSiege.txt', db) wagic = Deck() w = WagicDB('/home/correlr/Download/wth/PSP/GAME/WTH') for card in deck: wagic.append(w.getCard(card.name, card))