diff --git a/pysollib/games/acesup.py b/pysollib/games/acesup.py index 74457142..2588c81d 100644 --- a/pysollib/games/acesup.py +++ b/pysollib/games/acesup.py @@ -378,6 +378,8 @@ class TabbyCat(Game): s.talon = self.Talon_Class(x, y, self) l.createText(s.talon, "s") + self.setRegion(s.foundations, (-999, -999, l.YS*decks-l.CH/2, 999999)) + # define stack-groups l.defaultStackGroups() diff --git a/pysollib/games/fan.py b/pysollib/games/fan.py index cc45c76f..680138c7 100644 --- a/pysollib/games/fan.py +++ b/pysollib/games/fan.py @@ -615,7 +615,7 @@ class Quads_RowStack(RK_RowStack): getBottomImage = Stack._getReserveBottomImage class Quads(Troika): - RowStack_Class = StackWrapper(Quads_RowStack, dir=0, + RowStack_Class = FullStackWrapper(Quads_RowStack, dir=0, ##base_rank=NO_RANK, max_cards=4) def createGame(self): @@ -623,10 +623,18 @@ class Quads(Troika): def startGame(self): Troika.startGame(self, ncards=4) -## for i in range(3): -## self.s.talon.dealRow(rows=self.s.rows[:-1], frames=0) -## self.startDealSample() -## self.s.talon.dealRow(rows=self.s.rows[:-1]) + +class QuadsPlus(Quads): + def _shuffleHook(self, cards): + return self._shuffleHookMoveToTop(cards, + lambda c: (c.rank == ACE, c.suit)) + + def startGame(self): + self.s.talon.dealRow(rows=self.s.foundations, frames=0) + for i in range(3): + self.s.talon.dealRow(rows=self.s.rows[:-1], frames=0) + self.startDealSample() + self.s.talon.dealRow(rows=self.s.rows[:-1]) # ************************************************************************ @@ -944,4 +952,6 @@ registerGame(GameInfo(719, School, "School", GI.GT_FAN_TYPE, 1, 2, GI.SL_MOSTLY_SKILL)) registerGame(GameInfo(739, ForestGlade, "Forest Glade", GI.GT_FAN_TYPE, 2, 2, GI.SL_MOSTLY_SKILL)) +registerGame(GameInfo(767, QuadsPlus, "Quads +", + GI.GT_FAN_TYPE | GI.GT_OPEN | GI.GT_ORIGINAL, 1, 0, GI.SL_MOSTLY_SKILL)) diff --git a/pysollib/games/klondike.py b/pysollib/games/klondike.py index c03ad98a..bd0ce7b9 100644 --- a/pysollib/games/klondike.py +++ b/pysollib/games/klondike.py @@ -1182,33 +1182,33 @@ class LuckyThirteen(Game): if xoffset: xoffset = l.XOFFSET w0 = l.XS+playcards*l.XOFFSET - self.setSize(l.XM + 5*w0+2*l.XS, l.YM+4*l.YS) + self.setSize(l.XM + 5*w0, l.YM+4*l.YS) - x, y = l.XM, l.YM + x, y = l.XM, l.YM+l.YS for i in range(5): stack = self.RowStack_Class(x, y, self, max_move=1) s.rows.append(stack) stack.CARD_XOFFSET = xoffset stack.CARD_YOFFSET = 0 x += w0 - x, y = l.XM+w0, l.YM+l.YS + x, y = l.XM+w0, l.YM+2*l.YS for i in range(3): stack = self.RowStack_Class(x, y, self, max_move=1) s.rows.append(stack) stack.CARD_XOFFSET = xoffset stack.CARD_YOFFSET = 0 x += w0 - x, y = l.XM, l.YM+2*l.YS + x, y = l.XM, l.YM+3*l.YS for i in range(5): stack = self.RowStack_Class(x, y, self, max_move=1) s.rows.append(stack) stack.CARD_XOFFSET = xoffset stack.CARD_YOFFSET = 0 x += w0 - x, y = self.width-l.XS, l.YM + x, y = (self.width-4*l.XS)/2, l.YM for i in range(4): s.foundations.append(SS_FoundationStack(x, y, self, suit=i)) - y += l.YS + x += l.XS x, y = l.XM, self.height-l.YS s.talon = InitialDealTalonStack(x, y, self, max_rounds=1) diff --git a/pysollib/games/terrace.py b/pysollib/games/terrace.py index e011f341..df4ce383 100644 --- a/pysollib/games/terrace.py +++ b/pysollib/games/terrace.py @@ -60,6 +60,11 @@ class Terrace_AC_Foundation(AC_FoundationStack): return from_stack in self.game.s.rows return AC_FoundationStack.acceptsCards(self, from_stack, cards) + def getBaseCard(self): + if self.game.getState() == 0: + return _('Base card - %s.') % _('any card') + return AC_FoundationStack.getBaseCard(self) + class Terrace_SS_Foundation(SS_FoundationStack): def __init__(self, x, y, game, suit, **cap): @@ -75,6 +80,11 @@ class Terrace_SS_Foundation(SS_FoundationStack): return from_stack in self.game.s.rows return SS_FoundationStack.acceptsCards(self, from_stack, cards) + def getBaseCard(self): + if self.game.getState() == 0: + return _('Base card - %s.') % _('any card') + return SS_FoundationStack.getBaseCard(self) + class Terrace_RowStack(AC_RowStack): def __init__(self, x, y, game, **cap): @@ -286,13 +296,11 @@ class Signora(Terrace): # ************************************************************************ class Madame(Terrace): - Talon_Class = WasteTalonStack INITIAL_RESERVE_CARDS = 15 def createGame(self): Terrace.createGame(self, rows=10, playcards=20) def startGame(self): Terrace.startGame(self, nrows=10) - self.s.talon.dealCards() # ************************************************************************ diff --git a/pysollib/images.py b/pysollib/images.py index b89f5d8a..4a1fb46e 100644 --- a/pysollib/images.py +++ b/pysollib/images.py @@ -78,8 +78,6 @@ class Images: self._xshadow = [] self._shade = [] self._shadow_cards = {} # key: (suit, rank) - self._highlight_cards = {} # for mahjongg - self._shadow_back = None self._pil_shadow = {} # key: (width, height) self._pil_shadow_image = None @@ -354,35 +352,35 @@ class Images: def getShade(self): return self._shade[self._shade_index] - def getShadowCard(self, deck, suit, rank): - if (suit, rank) in self._shadow_cards: - shade = self._shadow_cards[(suit, rank)] + def _getShadow(self, image, card, color='#3896f8', factor=0.3): + if TOOLKIT == 'tk' and Image and Image.VERSION >= '1.1.7': + # use alpha image; one for each color + if color in self._shadow_cards: + shade = self._shadow_cards[color] + else: + shade = shadowImage(image, color, factor) + self._shadow_cards[color] = shade else: - image = self.getFace(deck, suit, rank) - shade = shadowImage(image) - self._shadow_cards[(suit, rank)] = shade + if card in self._shadow_cards: + shade = self._shadow_cards[card] + else: + shade = shadowImage(image, color, factor) + self._shadow_cards[card] = shade if not shade: return self.getShade() return shade + def getShadowCard(self, deck, suit, rank): + image = self.getFace(deck, suit, rank) + return self._getShadow(image, (suit, rank)) + def getHighlightCard(self, deck, suit, rank): - if (suit, rank) in self._highlight_cards: - shade = self._highlight_cards[(suit, rank)] - else: - image = self.getFace(deck, suit, rank) - shade = shadowImage(image, color='black', factor=0.3) - self._highlight_cards[(suit, rank)] = shade - if not shade: - return self.getShade() - return shade + image = self.getFace(deck, suit, rank) + return self._getShadow(image, (suit, rank, 'black'), 'black') def getShadowBack(self): - if self._shadow_back: - return self._shadow_back image = self.getBack() - shade = shadowImage(image) - self._shadow_back = shade - return shade + return self._getShadow(image, 'back') def getCardbacks(self): return self._back diff --git a/pysollib/stack.py b/pysollib/stack.py index 44cedff3..604e0475 100644 --- a/pysollib/stack.py +++ b/pysollib/stack.py @@ -2131,10 +2131,19 @@ class AbstractFoundationStack(OpenStack): return 0 def rightclickHandler(self, event): + ##return 0 + if self.game.app.opt.quickplay: + n = self.quickPlayHandler(event) + self.game.stats.quickplay_moves += n + return n return 0 - def quickPlayHandler(self, event, from_stacks=None, to_stacks=None): - return 0 + def quickPlayHandler(self, event): + ##return 0 + from_stacks = self.game.sg.dropstacks + self.game.s.foundations + ##to_stacks = self.game.sg.dropstacks + to_stacks = from_stacks + return OpenStack.quickPlayHandler(self, event, from_stacks, to_stacks) getBottomImage = Stack._getSuitBottomImage diff --git a/pysollib/tile/tkutil.py b/pysollib/tile/tkutil.py index 28c2b122..78d5952f 100644 --- a/pysollib/tile/tkutil.py +++ b/pysollib/tile/tkutil.py @@ -337,6 +337,12 @@ def shadowImage(image, color='#3896f8', factor=0.3): if not hasattr(image, '_pil_image'): return None im = image._pil_image + if Image.VERSION >= '1.1.7': + # use an alpha image + sh = Image.new('RGBA', im.size, color) + sh.putalpha(100) + out = Image.composite(sh, im, im) + return PIL_Image(image=out) sh = Image.new('RGBA', im.size, color) tmp = Image.blend(im, sh, factor) out = Image.composite(tmp, im, im) diff --git a/pysollib/tk/tkutil.py b/pysollib/tk/tkutil.py index 28c2b122..78d5952f 100644 --- a/pysollib/tk/tkutil.py +++ b/pysollib/tk/tkutil.py @@ -337,6 +337,12 @@ def shadowImage(image, color='#3896f8', factor=0.3): if not hasattr(image, '_pil_image'): return None im = image._pil_image + if Image.VERSION >= '1.1.7': + # use an alpha image + sh = Image.new('RGBA', im.size, color) + sh.putalpha(100) + out = Image.composite(sh, im, im) + return PIL_Image(image=out) sh = Image.new('RGBA', im.size, color) tmp = Image.blend(im, sh, factor) out = Image.composite(tmp, im, im) diff --git a/scripts/cardset_viewer.py b/scripts/cardset_viewer.py index 8e255b7a..afd30417 100755 --- a/scripts/cardset_viewer.py +++ b/scripts/cardset_viewer.py @@ -23,6 +23,8 @@ cardset_type = { '9': 'Trump only', } +all_imgs = False + class Cardset: def __init__(self, dir, name, type, ext, x, y): self.dir, self.name, self.type, self.ext, self.x, self.y = dir, name, type, ext, x, y @@ -61,8 +63,9 @@ def show_cardset(*args): cs = cardsets_dict[cs_name] ls = glob(os.path.join(cs.dir, '[0-9][0-9][a-z]'+cs.ext)) ls += glob(os.path.join(cs.dir, 'back*'+cs.ext)) - #ls += glob(os.path.join(cs.dir, 'bottom*.gif')) - #ls += glob(os.path.join(cs.dir, 'l*.gif')) + if all_imgs: + ls += glob(os.path.join(cs.dir, 'bottom*.gif')) + ls += glob(os.path.join(cs.dir, 'l*.gif')) #ls = glob(os.path.join(cs.dir, '*.gif')) ##if not ls: return ls.sort() @@ -251,6 +254,9 @@ def create_widgets(): return root if __name__ == '__main__': + if '-a' in sys.argv: + sys.argv.remove('-a') + all_imgs = True if len(sys.argv) > 1: data_dir = sys.argv[1] else: