* Add German texts for promo cards. * fix logic around missing set images; add translations of german promo card names to mapping
257 lines
8.3 KiB
Python
257 lines
8.3 KiB
Python
import json
|
|
import os
|
|
from reportlab.lib.units import cm
|
|
|
|
|
|
def getType(typespec):
|
|
return cardTypes[tuple(typespec)]
|
|
|
|
setImages = {
|
|
'dominion': 'base_set.png',
|
|
'intrigue': 'intrigue_set.png',
|
|
'seaside': 'seaside_set.png',
|
|
'prosperity': 'prosperity_set.png',
|
|
'alchemy': 'alchemy_set.png',
|
|
'cornucopia': 'cornucopia_set.png',
|
|
'cornucopia extras': 'cornucopia_set.png',
|
|
'hinterlands': 'hinterlands_set.png',
|
|
'dark ages': 'dark_ages_set.png',
|
|
'dark ages extras': 'dark_ages_set.png',
|
|
'guilds': 'guilds_set.png',
|
|
'adventures': 'adventures_set.png',
|
|
'adventures extras': 'adventures_set.png',
|
|
'empires': 'empires_set.png',
|
|
'empires extras': 'empires_set.png'
|
|
}
|
|
promoImages = {
|
|
'walled village': 'walled_village_set.png',
|
|
'stash': 'stash_set.png',
|
|
'governor': 'governor_set.png',
|
|
'black market': 'black_market_set.png',
|
|
'envoy': 'envoy_set.png',
|
|
'prince': 'prince_set.png',
|
|
'summon': 'summon_set.png'
|
|
}
|
|
|
|
setTextIcons = {
|
|
'dominion': 'D',
|
|
'intrigue': 'I',
|
|
'seaside': 'S',
|
|
'prosperity': 'P',
|
|
'alchemy': 'A',
|
|
'cornucopia': 'C',
|
|
'cornucopia extras': 'C',
|
|
'hinterlands': 'H',
|
|
'dark ages': 'DA',
|
|
'dark ages extras': 'DA',
|
|
'guilds': 'G',
|
|
'adventures': 'Ad',
|
|
'adventures extras': 'Ad',
|
|
'empires': 'E',
|
|
'empires extras': 'E'
|
|
}
|
|
|
|
promoTextIcons = {
|
|
'walled village': '',
|
|
'stash': '',
|
|
'governor': '',
|
|
'black market': '',
|
|
'envoy': '',
|
|
'prince': ''
|
|
}
|
|
|
|
language_mapping = None
|
|
|
|
|
|
class Card(object):
|
|
|
|
language_mapping = None
|
|
|
|
class CardJSONEncoder(json.JSONEncoder):
|
|
|
|
def default(self, obj):
|
|
if isinstance(obj, Card):
|
|
return obj.__dict__
|
|
return json.JSONEncoder.default(self, obj)
|
|
|
|
@staticmethod
|
|
def decode_json(obj):
|
|
return Card(**obj)
|
|
|
|
@classmethod
|
|
def getSetImage(cls, setName, cardName):
|
|
if setName in setImages:
|
|
return setImages[setName]
|
|
if cardName.lower() in promoImages:
|
|
return promoImages[cardName.lower()]
|
|
if setName in cls.language_mapping:
|
|
trans = cls.language_mapping[setName]
|
|
if trans in setImages:
|
|
return setImages[trans]
|
|
if cardName in cls.language_mapping:
|
|
trans = cls.language_mapping[cardName]
|
|
if trans.lower() in promoImages:
|
|
return promoImages[trans.lower()]
|
|
return None
|
|
|
|
@classmethod
|
|
def getSetText(cls, setName, cardName):
|
|
if setName in setTextIcons:
|
|
return setTextIcons[setName]
|
|
if cardName.lower() in promoTextIcons:
|
|
return promoTextIcons[cardName.lower()]
|
|
return None
|
|
|
|
def __init__(self, name, cardset, types, cost, description='', potcost=0, debtcost=0, extra='', count=-1):
|
|
self.name = name.strip()
|
|
self.cardset = cardset.strip()
|
|
self.types = types
|
|
self.cost = cost
|
|
self.potcost = potcost
|
|
self.debtcost = debtcost
|
|
self.description = description
|
|
self.extra = extra
|
|
if count < 0:
|
|
self.count = getType(self.types).getTypeDefaultCardCount()
|
|
else:
|
|
self.count = count
|
|
|
|
def getCardCount(self):
|
|
return self.count
|
|
|
|
def setCardCount(self, value):
|
|
self.count = value
|
|
|
|
def getStackHeight(self, thickness):
|
|
# return height of the stacked cards in cm. Using hight in cm of a stack of 60 Copper cards as thickness.
|
|
return self.count * cm * (thickness / 60.0) + 2
|
|
|
|
def getType(self):
|
|
return getType(self.types)
|
|
|
|
def __repr__(self):
|
|
return '"' + self.name + '"'
|
|
|
|
def toString(self):
|
|
return self.name + ' ' + self.cardset + ' ' + '-'.join(self.types)\
|
|
+ ' ' + self.cost + ' ' + self.description + ' ' + self.extra
|
|
|
|
def isExpansion(self):
|
|
return 'Expansion' in self.getType().getTypeNames()
|
|
|
|
def isEvent(self):
|
|
return 'Event' in self.getType().getTypeNames()
|
|
|
|
def isLandmark(self):
|
|
return 'Landmark' in self.getType().getTypeNames()
|
|
|
|
def isPrize(self):
|
|
return 'Prize' in self.getType().getTypeNames()
|
|
|
|
def isType(self, what):
|
|
return what in self.getType().getTypeNames()
|
|
|
|
def setImage(self):
|
|
setImage = Card.getSetImage(self.cardset, self.name)
|
|
if setImage is None and self.cardset != 'base':
|
|
print 'warning, no set image for set "{}" card "{}"'.format(self.cardset, self.name)
|
|
return setImage
|
|
|
|
def setTextIcon(self):
|
|
setTextIcon = Card.getSetText(self.cardset, self.name)
|
|
if setTextIcon is None and self.cardset != 'base':
|
|
print 'warning, no set text for set "{}" card "{}"'.format(self.cardset, self.name)
|
|
return setTextIcon
|
|
|
|
def isBlank(self):
|
|
return False
|
|
|
|
|
|
class BlankCard(Card):
|
|
|
|
def __init__(self, num):
|
|
Card.__init__(self, str(num), 'extra', ('Blank',), 0)
|
|
|
|
def isBlank(self):
|
|
return True
|
|
|
|
|
|
class CardType(object):
|
|
|
|
def __init__(self, typeNames, tabImageFile, defaultCardCount=10, tabTextHeightOffset=0, tabCostHeightOffset=-1):
|
|
self.typeNames = typeNames
|
|
self.tabImageFile = tabImageFile
|
|
self.tabTextHeightOffset = tabTextHeightOffset
|
|
self.tabCostHeightOffset = tabCostHeightOffset
|
|
self.defaultCardCount = defaultCardCount
|
|
|
|
def getTypeDefaultCardCount(self):
|
|
return self.defaultCardCount
|
|
|
|
def getTypeNames(self):
|
|
return self.typeNames
|
|
|
|
def getTabImageFile(self):
|
|
if not self.tabImageFile:
|
|
return None
|
|
return self.tabImageFile
|
|
|
|
def getNoCoinTabImageFile(self):
|
|
if not self.tabImageFile:
|
|
return None
|
|
return ''.join(os.path.splitext(self.tabImageFile)[0] + '_nc' + os.path.splitext(self.tabImageFile)[1])
|
|
|
|
def getTabTextHeightOffset(self):
|
|
return self.tabTextHeightOffset
|
|
|
|
def getTabCostHeightOffset(self):
|
|
return self.tabCostHeightOffset
|
|
|
|
cardTypes = [
|
|
CardType(('Action',), 'action.png'),
|
|
CardType(('Action', 'Attack'), 'action.png'),
|
|
CardType(('Action', 'Attack', 'Prize'), 'action.png', 1),
|
|
CardType(('Action', 'Reaction'), 'reaction.png'),
|
|
CardType(('Action', 'Victory'), 'action-victory.png', 12),
|
|
CardType(('Action', 'Duration'), 'duration.png', 5),
|
|
CardType(('Action', 'Duration', 'Reaction'), 'duration-reaction.png'),
|
|
CardType(('Action', 'Attack', 'Duration'), 'duration.png'),
|
|
CardType(('Action', 'Looter'), 'action.png'),
|
|
CardType(('Action', 'Prize'), 'action.png', 1),
|
|
CardType(('Action', 'Ruins'), 'ruins.png', 10, 0, 1),
|
|
CardType(('Action', 'Shelter'), 'action-shelter.png', 6),
|
|
CardType(('Action', 'Attack', 'Duration'), 'duration.png'),
|
|
CardType(('Action', 'Attack', 'Looter'), 'action.png'),
|
|
CardType(('Action', 'Attack', 'Traveller'), 'action.png', 5),
|
|
CardType(('Action', 'Reserve'), 'reserve.png', 5),
|
|
CardType(('Action', 'Reserve', 'Victory'), 'reserve-victory.png', 12),
|
|
CardType(('Action', 'Traveller'), 'action.png', 5),
|
|
CardType(('Action', 'Gathering'), 'action.png'),
|
|
CardType(('Action', 'Treasure'), 'action-treasure.png'),
|
|
CardType(('Prize',), 'action.png', 1),
|
|
CardType(('Event',), 'event.png', 1),
|
|
CardType(('Reaction',), 'reaction.png'),
|
|
CardType(('Reaction', 'Shelter'), 'reaction-shelter.png', 6),
|
|
CardType(('Treasure',), 'treasure.png', 10, 3, 0),
|
|
CardType(('Treasure', 'Attack'), 'treasure.png'),
|
|
CardType(('Treasure', 'Victory'), 'treasure-victory.png', 12),
|
|
CardType(('Treasure', 'Prize'), 'treasure.png', 1, 3, 0),
|
|
CardType(('Treasure', 'Reaction'), 'treasure-reaction.png', 10, 0, 1),
|
|
CardType(('Treasure', 'Reserve'), 'reserve-treasure.png'),
|
|
CardType(('Victory',), 'victory.png', 12),
|
|
CardType(('Victory', 'Reaction'), 'victory-reaction.png', 12, 0, 1),
|
|
CardType(('Victory', 'Shelter'), 'victory-shelter.png', 6),
|
|
CardType(('Victory', 'Castle'), 'victory.png', 12),
|
|
CardType(('Curse',), 'curse.png', 30, 3),
|
|
CardType(('Trash',), 'action.png', 1),
|
|
CardType(('Prizes',), 'action.png', 0),
|
|
CardType(('Events',), 'event.png', 0),
|
|
CardType(('Shelters',), 'shelter.png', 0),
|
|
CardType(('Expansion',), 'expansion.png', 0, 4),
|
|
CardType(('Blank',), ''),
|
|
CardType(('Landmark',), 'landmark.png', 1),
|
|
CardType(('Landmarks',), 'landmark.png', 0)
|
|
]
|
|
|
|
cardTypes = dict(((c.getTypeNames(), c) for c in cardTypes))
|