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): try: return self.findCard(name).next() except: raise Exception('Invalid card: {0}'.format(name)) 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*(\((\d+|[{0}])/(\d+|[{0}])\))*[{0}]*$'.format(''.join(Mana.types.keys())), line.upper()): card['cost'] = line continue elif not card['type']: attributes = line.split(' -- ') type = attributes.pop(0) card['type'] = type card['attributes'] = [a for a in ''.join(attributes).split(' ') if a] 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') c = db.getCard('Balefire Liege') print c