def __sub__(self, other): """self - other""" result = self.copy() for key, value in other.items(): result[key] -= value for key in defaultdict.keys(result): if result[key] == 0: del result[key] return result
def _endWallDangerous(self): """if end of living wall is reached, declare all invisible tiles as dangerous""" if len(self.wall.living) <=5: allTiles = [x for x in defaultdict.keys(elements.occurrence) if x[0] not in 'fy'] # see http://www.logilab.org/ticket/23986 invisibleTiles = set(x for x in allTiles if x not in self.visibleTiles) msg = m18n('Short living wall: Tile is invisible, hence dangerous') self.dangerousTiles = list(x for x in self.dangerousTiles if x[1] != msg) self.dangerousTiles.append((invisibleTiles, msg))
def findDangerousTiles(self): """update the list of dangerous tile""" pName = self.localName dangerous = list() expMeldCount = len(self._exposedMelds) if expMeldCount >= 3: if all(x in elements.greenHandTiles for x in self.visibleTiles): dangerous.append( (elements.greenHandTiles, i18n('Player %1 has 3 or 4 exposed melds, all are green', pName))) group = list(defaultdict.keys(self.visibleTiles))[0].group # see https://www.logilab.org/ticket/23986 assert group.islower(), self.visibleTiles if group in Tile.colors: if all(x.group == group for x in self.visibleTiles): suitTiles = set([Tile(group, x) for x in Tile.numbers]) if self.visibleTiles.count(suitTiles) >= 9: dangerous.append( (suitTiles, i18n('Player %1 may try a True Color Game', pName))) elif all(x.value in Tile.terminals for x in self.visibleTiles): dangerous.append( (elements.terminals, i18n('Player %1 may try an All Terminals Game', pName))) if expMeldCount >= 2: windMelds = sum(self.visibleTiles[x] >= 3 for x in elements.winds) dragonMelds = sum(self.visibleTiles[x] >= 3 for x in elements.dragons) windsDangerous = dragonsDangerous = False if windMelds + dragonMelds == expMeldCount and expMeldCount >= 3: windsDangerous = dragonsDangerous = True windsDangerous = windsDangerous or windMelds >= 3 dragonsDangerous = dragonsDangerous or dragonMelds >= 2 if windsDangerous: dangerous.append((set(x for x in elements.winds if x not in self.visibleTiles), i18n('Player %1 exposed many winds', pName))) if dragonsDangerous: dangerous.append((set(x for x in elements.dragons if x not in self.visibleTiles), i18n('Player %1 exposed many dragons', pName))) self.dangerousTiles = dangerous if dangerous and Debug.dangerousGame: self.game.debug('dangerous:%s' % dangerous)
def _endWallDangerous(self): """if end of living wall is reached, declare all invisible tiles as dangerous""" if len(self.wall.living) <= 5: allTiles = [ x for x in defaultdict.keys(elements.occurrence) if not x.isBonus ] for tile in allTiles: assert isinstance(tile, Tile), tile # see https://www.logilab.org/ticket/23986 invisibleTiles = set(x for x in allTiles if x not in self.visibleTiles) msg = i18n('Short living wall: Tile is invisible, hence dangerous') self.dangerousTiles = list(x for x in self.dangerousTiles if x[1] != msg) self.dangerousTiles.append((invisibleTiles, msg))
def findDangerousTiles(self): """update the list of dangerous tile""" pName = self.localName dangerous = list() expMeldCount = len(self._exposedMelds) if expMeldCount >= 3: if all(x in elements.greenHandTiles for x in self.visibleTiles): dangerous.append((elements.greenHandTiles, m18n('Player %1 has 3 or 4 exposed melds, all are green', pName))) group = list(defaultdict.keys(self.visibleTiles))[0].group # see http://www.logilab.org/ticket/23986 assert group.islower(), self.visibleTiles if group in Tile.colors: if all(x.group == group for x in self.visibleTiles): suitTiles = set([Tile(group, x) for x in Tile.numbers]) if self.visibleTiles.count(suitTiles) >= 9: dangerous.append( (suitTiles, m18n('Player %1 may try a True Color Game', pName))) elif all(x.value in Tile.terminals for x in self.visibleTiles): dangerous.append((elements.terminals, m18n('Player %1 may try an All Terminals Game', pName))) if expMeldCount >= 2: windMelds = sum(self.visibleTiles[x] >= 3 for x in elements.winds) dragonMelds = sum( self.visibleTiles[x] >= 3 for x in elements.dragons) windsDangerous = dragonsDangerous = False if windMelds + dragonMelds == expMeldCount and expMeldCount >= 3: windsDangerous = dragonsDangerous = True windsDangerous = windsDangerous or windMelds >= 3 dragonsDangerous = dragonsDangerous or dragonMelds >= 2 if windsDangerous: dangerous.append( (set(x for x in elements.winds if x not in self.visibleTiles), m18n('Player %1 exposed many winds', pName))) if dragonsDangerous: dangerous.append( (set(x for x in elements.dragons if x not in self.visibleTiles), m18n('Player %1 exposed many dragons', pName))) self.dangerousTiles = dangerous if dangerous and Debug.dangerousGame: self.game.debug('dangerous:%s' % dangerous)
def findDangerousTiles(self): """update the list of dangerous tile""" pName = self.localName dangerous = list() expMeldCount = len(self._exposedMelds) if expMeldCount >= 3: if all(x in elements.greenHandTiles for x in self.visibleTiles): dangerous.append((elements.greenHandTiles, m18n('Player %1 has 3 or 4 exposed melds, all are green', pName))) color = defaultdict.keys(self.visibleTiles)[0][0] # see http://www.logilab.org/ticket/23986 assert color.islower(), self.visibleTiles if color in 'sbc': if all(x[0] == color for x in self.visibleTiles): suitTiles = set([color+x for x in '123456789']) if self.visibleTiles.count(suitTiles) >= 9: dangerous.append((suitTiles, m18n('Player %1 may try a True Color Game', pName))) elif all(x[1] in '19' for x in self.visibleTiles): dangerous.append((elements.terminals, m18n('Player %1 may try an All Terminals Game', pName))) if expMeldCount >= 2: windMelds = sum(self.visibleTiles[x] >=3 for x in elements.winds) dragonMelds = sum(self.visibleTiles[x] >=3 for x in elements.dragons) windsDangerous = dragonsDangerous = False if windMelds + dragonMelds == expMeldCount and expMeldCount >= 3: windsDangerous = dragonsDangerous = True windsDangerous = windsDangerous or windMelds >= 3 dragonsDangerous = dragonsDangerous or dragonMelds >= 2 if windsDangerous: dangerous.append((set(x for x in elements.winds if x not in self.visibleTiles), m18n('Player %1 exposed many winds', pName))) if dragonsDangerous: dangerous.append((set(x for x in elements.dragons if x not in self.visibleTiles), m18n('Player %1 exposed many dragons', pName))) self.dangerousTiles = dangerous if dangerous and Debug.dangerousGame: self.game.debug('dangerous:%s' % dangerous)
def keys(self): return [ k for k in defaultdict.keys(self) if k[0] != '_' and k != 'trait_names' ]