1
0
Fork 0
mirror of https://github.com/shlomif/PySolFC.git synced 2025-04-05 00:02:29 -04:00
This commit is contained in:
Shlomi Fish 2017-04-16 23:33:58 +03:00
parent 5c4ba0ff44
commit 9cc258de85
2 changed files with 69 additions and 84 deletions

View file

@ -1,25 +1,25 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- mode: python; coding: utf-8; -*- # -*- mode: python; coding: utf-8; -*-
##---------------------------------------------------------------------------## # ---------------------------------------------------------------------------##
## #
## Copyright (C) 1998-2003 Markus Franz Xaver Johannes Oberhumer # Copyright (C) 1998-2003 Markus Franz Xaver Johannes Oberhumer
## Copyright (C) 2003 Mt. Hood Playing Card Co. # Copyright (C) 2003 Mt. Hood Playing Card Co.
## Copyright (C) 2005-2009 Skomoroh # Copyright (C) 2005-2009 Skomoroh
## #
## This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
## the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version. # (at your option) any later version.
## #
## This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details. # GNU General Public License for more details.
## #
## You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
## along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
## #
##---------------------------------------------------------------------------## # ---------------------------------------------------------------------------##
# imports # imports
@ -58,11 +58,11 @@ class Layout:
self.canvas = self.game.canvas self.canvas = self.game.canvas
self.size = None self.size = None
self.s = Struct( self.s = Struct(
talon = None, talon=None,
waste = None, waste=None,
foundations = [], foundations=[],
rows = [], rows=[],
reserves = [], reserves=[],
) )
self.stackmap = {} self.stackmap = {}
self.regions = [] self.regions = []
@ -101,31 +101,31 @@ class Layout:
else: else:
self.YS = self.CH + card_y_space self.YS = self.CH + card_y_space
##self.CARD_X_SPACE = layout_card_x_space # self.CARD_X_SPACE = layout_card_x_space
##self.CARD_Y_SPACE = layout_card_y_space # self.CARD_Y_SPACE = layout_card_y_space
##self.RIGHT_MARGIN = layout_x_margin-layout_card_x_space # self.RIGHT_MARGIN = layout_x_margin-layout_card_x_space
##self.BOTTOM_MARGIN = layout_y_margin-layout_card_y_space # self.BOTTOM_MARGIN = layout_y_margin-layout_card_y_space
font = game.app.getFont("canvas_default") font = game.app.getFont("canvas_default")
##self.TEXT_MARGIN = 10 # self.TEXT_MARGIN = 10
self.TEXT_MARGIN = font[1] self.TEXT_MARGIN = font[1]
##self.TEXT_HEIGHT = 30 # self.TEXT_HEIGHT = 30
self.TEXT_HEIGHT = 18+font[1] self.TEXT_HEIGHT = 18+font[1]
self.__dict__.update(kw) self.__dict__.update(kw)
if self.game.preview > 1: if self.game.preview > 1:
if "XOFFSET" in kw: if "XOFFSET" in kw:
self.XOFFSET = self.XOFFSET / self.game.preview self.XOFFSET /= self.game.preview
if "YOFFSET" in kw: if "YOFFSET" in kw:
self.YOFFSET = self.YOFFSET / self.game.preview self.YOFFSET /= self.game.preview
self.TEXT_HEIGHT = 10 self.TEXT_HEIGHT = 10
def __createStack(self, x, y, suit=None): def __createStack(self, x, y, suit=None):
stack = _LayoutStack(x, y, suit) stack = _LayoutStack(x, y, suit)
mapkey = (stack.x, stack.y) mapkey = (stack.x, stack.y)
#from pprint import pprint # from pprint import pprint
#print mapkey # print mapkey
#pprint(self.stackmap) # pprint(self.stackmap)
assert mapkey not in self.stackmap assert mapkey not in self.stackmap
self.stackmap[mapkey] = stack self.stackmap[mapkey] = stack
return stack return stack
@ -186,7 +186,6 @@ class Layout:
s2 = self.s.reserves[i] s2 = self.s.reserves[i]
s1.texts.ncards = self.defaultText(s2) s1.texts.ncards = self.defaultText(s2)
# #
# public util for use by class Game # public util for use by class Game
# #
@ -198,16 +197,16 @@ class Layout:
delta_x, delta_y = 4, 4 delta_x, delta_y = 4, 4
delta_yy = 10 delta_yy = 10
d = { d = {
"n" : (x+self.CW/2, y-delta_y, "s", "%d"), "n": (x+self.CW/2, y-delta_y, "s", "%d"),
"nn": (x+self.CW/2, y-delta_yy, "s", "%d"), "nn": (x+self.CW/2, y-delta_yy, "s", "%d"),
"s" : (x+self.CW/2, y+self.CH+delta_y, "n", "%d"), "s": (x+self.CW/2, y+self.CH+delta_y, "n", "%d"),
"ss": (x+self.CW/2, y+self.CH+delta_yy, "n", "%d"), "ss": (x+self.CW/2, y+self.CH+delta_yy, "n", "%d"),
"nw": (x-delta_x, y, "ne", "%d"), "nw": (x-delta_x, y, "ne", "%d"),
"sw": (x-delta_x, y+self.CH, "se", "%d"), "sw": (x-delta_x, y+self.CH, "se", "%d"),
"ne": (x+self.CW+delta_x, y, "nw", "%d"), "ne": (x+self.CW+delta_x, y, "nw", "%d"),
"se": (x+self.CW+delta_x, y+self.CH, "sw", "%d"), "se": (x+self.CW+delta_x, y+self.CH, "sw", "%d"),
"w" : (x-delta_x, y+self.CH/2, "e", "%d"), "w": (x-delta_x, y+self.CH/2, "e", "%d"),
"e" : (x+self.CW+delta_x, y+self.CH/2, "w", "%d"), "e": (x+self.CW+delta_x, y+self.CH/2, "w", "%d"),
} }
return d[anchor] return d[anchor]
@ -242,7 +241,6 @@ class Layout:
def setRegion(self, stacks, rects): def setRegion(self, stacks, rects):
self.regions.append((stacks, rects)) self.regions.append((stacks, rects))
# #
# util for use by a Game # util for use by a Game
# #
@ -262,10 +260,11 @@ class Layout:
def defaultText(self, layout_stack): def defaultText(self, layout_stack):
if self.canvas.preview > 1: if self.canvas.preview > 1:
return None return None
##print layout_stack, layout_stack.text_args # print layout_stack, layout_stack.text_args
if layout_stack is None or not layout_stack.text_args: if layout_stack is None or not layout_stack.text_args:
return None return None
layout_stack.text_args["font"] = self.game.app.getFont("canvas_default") layout_stack.text_args["font"] = \
self.game.app.getFont("canvas_default")
t = MfxCanvasText(self.game.canvas, **layout_stack.text_args) t = MfxCanvasText(self.game.canvas, **layout_stack.text_args)
t.text_format = layout_stack.text_format t.text_format = layout_stack.text_format
return t return t
@ -274,7 +273,8 @@ class Layout:
def defaultStackGroups(self): def defaultStackGroups(self):
game = self.game game = self.game
waste = [] waste = []
if game.s.waste is not None: waste = [game.s.waste] if game.s.waste is not None:
waste = [game.s.waste]
game.sg.talonstacks = [game.s.talon] + waste game.sg.talonstacks = [game.s.talon] + waste
game.sg.dropstacks = game.s.rows + game.s.reserves + waste game.sg.dropstacks = game.s.rows + game.s.reserves + waste
game.sg.openstacks = game.s.foundations + game.s.rows + game.s.reserves game.sg.openstacks = game.s.foundations + game.s.rows + game.s.reserves
@ -288,10 +288,9 @@ class Layout:
mapkey = (s.x, s.y) mapkey = (s.x, s.y)
id = self.game.stackmap[mapkey] id = self.game.stackmap[mapkey]
stacks.append(self.game.allstacks[id]) stacks.append(self.game.allstacks[id])
##print stacks, region[1] # print stacks, region[1]
self.game.setRegion(stacks, region[1]) self.game.setRegion(stacks, region[1])
# #
# Baker's Dozen layout # Baker's Dozen layout
# - left: 2 rows # - left: 2 rows
@ -330,14 +329,13 @@ class Layout:
# create talon # create talon
h = YM + 2*h h = YM + 2*h
self.s.talon = s = S(x, h - YS) self.s.talon = S(x, h - YS)
if texts: if texts:
assert 0 assert 0
# set window # set window
self.size = (XM + (halfrows+decks)*XS, h) self.size = (XM + (halfrows+decks)*XS, h)
# #
# FreeCell layout # FreeCell layout
# - top: free cells, foundations # - top: free cells, foundations
@ -348,7 +346,7 @@ class Layout:
def freeCellLayout(self, rows, reserves, waste=0, def freeCellLayout(self, rows, reserves, waste=0,
texts=0, reserve_texts=False, playcards=18): texts=0, reserve_texts=False, playcards=18):
S = self.__createStack S = self.__createStack
CW, CH = self.CW, self.CH CH = self.CH
XM, YM = self.XM, self.YM XM, YM = self.XM, self.YM
XS, YS = self.XS, self.YS XS, YS = self.XS, self.YS
@ -411,7 +409,6 @@ class Layout:
# set window # set window
self.size = (w, h) self.size = (w, h)
# #
# Gypsy layout # Gypsy layout
# - left: rows # - left: rows
@ -487,7 +484,6 @@ class Layout:
# set window # set window
self.size = (w, h) self.size = (w, h)
# #
# Harp layout # Harp layout
# - top: reserves, rows # - top: reserves, rows
@ -497,7 +493,7 @@ class Layout:
def harpLayout(self, rows, waste, reserves=0, def harpLayout(self, rows, waste, reserves=0,
texts=1, reserve_texts=False, playcards=19): texts=1, reserve_texts=False, playcards=19):
S = self.__createStack S = self.__createStack
CW, CH = self.CW, self.CH CH = self.CH
XM, YM = self.XM, self.YM XM, YM = self.XM, self.YM
XS, YS = self.XS, self.YS XS, YS = self.XS, self.YS
@ -511,7 +507,8 @@ class Layout:
# set size so that at least 19 cards are fully playable # set size so that at least 19 cards are fully playable
h = YS + (playcards-1)*self.YOFFSET h = YS + (playcards-1)*self.YOFFSET
h = max(h, 3*YS) h = max(h, 3*YS)
if texts: h += self.TEXT_HEIGHT if texts:
h += self.TEXT_HEIGHT
if reserves: if reserves:
h += YS h += YS
if reserves and reserve_texts: if reserves and reserve_texts:
@ -563,7 +560,6 @@ class Layout:
# set window # set window
self.size = (w, YM + h + YS) self.size = (w, YM + h + YS)
# #
# Klondike layout # Klondike layout
# - top: talon, waste, foundations # - top: talon, waste, foundations
@ -575,7 +571,7 @@ class Layout:
texts=1, reserve_texts=False, round_text=False, texts=1, reserve_texts=False, round_text=False,
playcards=16, center=1, text_height=0): playcards=16, center=1, text_height=0):
S = self.__createStack S = self.__createStack
CW, CH = self.CW, self.CH CH = self.CH
XM, YM = self.XM, self.YM XM, YM = self.XM, self.YM
XS, YS = self.XS, self.YS XS, YS = self.XS, self.YS
@ -597,7 +593,7 @@ class Layout:
h += self.TEXT_HEIGHT h += self.TEXT_HEIGHT
# top # top
##text_height = 0 # text_height = 0
x, y = XM, YM x, y = XM, YM
self.s.talon = s = S(x, y) self.s.talon = s = S(x, y)
if texts: if texts:
@ -623,7 +619,8 @@ class Layout:
x = XM + (maxrows - frows) * XS / 2 x = XM + (maxrows - frows) * XS / 2
for suit in range(suits / foundrows): for suit in range(suits / foundrows):
for i in range(decks): for i in range(decks):
self.s.foundations.append(S(x, y, suit=suit + (row * (suits / 2)))) self.s.foundations.append(
S(x, y, suit=suit + (row * (suits / 2))))
x += XS x += XS
y += YS y += YS
@ -631,7 +628,7 @@ class Layout:
x = XM x = XM
if rows < maxrows: if rows < maxrows:
x += (maxrows-rows) * XS/2 x += (maxrows-rows) * XS/2
##y += YM * (3 - foundrows) # y += YM * (3 - foundrows)
y += text_height y += text_height
for i in range(rows): for i in range(rows):
self.s.rows.append(S(x, y)) self.s.rows.append(S(x, y))
@ -657,7 +654,6 @@ class Layout:
# set window # set window
self.size = (w, h) self.size = (w, h)
# #
# Yukon layout # Yukon layout
# - left: rows # - left: rows
@ -701,7 +697,6 @@ class Layout:
# set window # set window
self.size = (XM + (rows+decks)*XS, h) self.size = (XM + (rows+decks)*XS, h)
# #
# Easy layout # Easy layout
# - top: talon, waste, foundations # - top: talon, waste, foundations
@ -710,7 +705,7 @@ class Layout:
def easyLayout(self, rows, waste, texts=1, playcards=10, center=1): def easyLayout(self, rows, waste, texts=1, playcards=10, center=1):
S = self.__createStack S = self.__createStack
CW, CH = self.CW, self.CH CH = self.CH
XM, YM = self.XM, self.YM XM, YM = self.XM, self.YM
XS, YS = self.XS, self.YS XS, YS = self.XS, self.YS
@ -766,7 +761,6 @@ class Layout:
# set window # set window
self.size = (XM + maxrows * XS, YM + YS + yextra + h) self.size = (XM + maxrows * XS, YM + YS + yextra + h)
# #
# Samuri layout # Samuri layout
# - top center: rows # - top center: rows
@ -776,12 +770,11 @@ class Layout:
def samuriLayout(self, rows, waste, texts=1, playcards=20, center=1): def samuriLayout(self, rows, waste, texts=1, playcards=20, center=1):
S = self.__createStack S = self.__createStack
CW, CH = self.CW, self.CH CH = self.CH
XM, YM = self.XM, self.YM XM, YM = self.XM, self.YM
XS, YS = self.XS, self.YS XS, YS = self.XS, self.YS
decks = self.game.gameinfo.decks decks = self.game.gameinfo.decks
suits = len(self.game.gameinfo.suits) + bool(self.game.gameinfo.trumps)
toprows = 2 * decks + rows toprows = 2 * decks + rows
yextra = 0 yextra = 0
@ -830,7 +823,6 @@ class Layout:
# set window # set window
self.size = (XM + toprows * XS, YM + YS + yextra + h) self.size = (XM + toprows * XS, YM + YS + yextra + h)
# #
# Sumo layout # Sumo layout
# - top center: rows # - top center: rows
@ -840,12 +832,11 @@ class Layout:
def sumoLayout(self, rows, reserves, texts=0, playcards=12, center=1): def sumoLayout(self, rows, reserves, texts=0, playcards=12, center=1):
S = self.__createStack S = self.__createStack
CW, CH = self.CW, self.CH CH = self.CH
XM, YM = self.XM, self.YM XM, YM = self.XM, self.YM
XS, YS = self.XS, self.YS XS, YS = self.XS, self.YS
decks = self.game.gameinfo.decks decks = self.game.gameinfo.decks
suits = len(self.game.gameinfo.suits) + bool(self.game.gameinfo.trumps)
assert reserves % 2 == 0 assert reserves % 2 == 0
toprows = 12 toprows = 12
maxrows = max(rows, toprows) maxrows = max(rows, toprows)
@ -868,7 +859,9 @@ class Layout:
for i in range(rows): for i in range(rows):
self.s.rows.append(S(x, y)) self.s.rows.append(S(x, y))
x += XS x += XS
self.setRegion(self.s.rows, (XS + XM / 2, YS * decks + YM / 2, XS * 11 - XM / 2, 999999)) self.setRegion(
self.s.rows,
(XS + XM / 2, YS * decks + YM / 2, XS * 11 - XM / 2, 999999))
# create reserves # create reserves
x, y = XM, YM + YS * decks x, y = XM, YM + YS * decks
@ -890,7 +883,6 @@ class Layout:
# set window # set window
self.size = (XM + toprows * XS, YM + YS + h) self.size = (XM + toprows * XS, YM + YS + h)
# #
# Fun layout # Fun layout
# - top: rows # - top: rows
@ -900,7 +892,7 @@ class Layout:
def funLayout(self, rows, reserves, texts=0, playcards=12, center=1): def funLayout(self, rows, reserves, texts=0, playcards=12, center=1):
S = self.__createStack S = self.__createStack
CW, CH = self.CW, self.CH CH = self.CH
XM, YM = self.XM, self.YM XM, YM = self.XM, self.YM
XS, YS = self.XS, self.YS XS, YS = self.XS, self.YS
@ -953,7 +945,6 @@ class Layout:
# set window # set window
self.size = (w, YM + YS + h) self.size = (w, YM + YS + h)
# #
# Oonsoo layout # Oonsoo layout
# - top: talon & rows # - top: talon & rows
@ -963,7 +954,7 @@ class Layout:
def oonsooLayout(self, rows, reserves, texts=0, playcards=12, center=1): def oonsooLayout(self, rows, reserves, texts=0, playcards=12, center=1):
S = self.__createStack S = self.__createStack
CW, CH = self.CW, self.CH CH = self.CH
XM, YM = self.XM, self.YM XM, YM = self.XM, self.YM
XS, YS = self.XS, self.YS XS, YS = self.XS, self.YS
@ -1005,7 +996,6 @@ class Layout:
# set window # set window
self.size = (w, YM + YS + h) self.size = (w, YM + YS + h)
# #
# Ghulam layout # Ghulam layout
# - left & right: foundations & reserves # - left & right: foundations & reserves
@ -1015,11 +1005,9 @@ class Layout:
def ghulamLayout(self, rows, reserves=0, texts=0): def ghulamLayout(self, rows, reserves=0, texts=0):
S = self.__createStack S = self.__createStack
CW, CH = self.CW, self.CH
XM, YM = self.XM, self.YM XM, YM = self.XM, self.YM
XS, YS = self.XS, self.YS XS, YS = self.XS, self.YS
decks = self.game.gameinfo.decks
suits = len(self.game.gameinfo.suits) suits = len(self.game.gameinfo.suits)
assert rows % 2 == 0 assert rows % 2 == 0
assert reserves % 2 == 0 assert reserves % 2 == 0
@ -1050,23 +1038,21 @@ class Layout:
self.s.reserves.append(S(w - XS, h - YS * (i + 1))) self.s.reserves.append(S(w - XS, h - YS * (i + 1)))
# create talon # create talon
self.s.talon = s = S(w - XS * 2, h - YS) self.s.talon = S(w - XS * 2, h - YS)
if texts: if texts:
assert 0 assert 0
# set window # set window
self.size = (w, h) self.size = (w, h)
# #
# Generiklon layout # Generiklon layout
# - top: talon & foundations # - top: talon & foundations
# - bottom: rows # - bottom: rows
# #
def generiklonLayout(self, rows, waste = 1, height = 6): def generiklonLayout(self, rows, waste=1, height=6):
S = self.__createStack S = self.__createStack
CW, CH = self.CW, self.CH
XM, YM = self.XM, self.YM XM, YM = self.XM, self.YM
XS, YS = self.XS, self.YS XS, YS = self.XS, self.YS
@ -1090,13 +1076,13 @@ class Layout:
x = w - fspace - XS * frows / 2 x = w - fspace - XS * frows / 2
for suit in range(suits / 2): for suit in range(suits / 2):
for i in range(decks): for i in range(decks):
self.s.foundations.append(S(x, y, suit = suit)) self.s.foundations.append(S(x, y, suit=suit))
x += XS x += XS
x = w - fspace - XS * frows / 2 x = w - fspace - XS * frows / 2
y += YS y += YS
for suit in range(suits / 2): for suit in range(suits / 2):
for i in range(decks): for i in range(decks):
self.s.foundations.append(S(x, y, suit = suit + suits / 2)) self.s.foundations.append(S(x, y, suit=(suit + suits / 20)))
x += XS x += XS
# bottom # bottom
@ -1105,4 +1091,3 @@ class Layout:
self.s.rows.append(S(x, y)) self.s.rows.append(S(x, y))
x += XS x += XS
self.setRegion(self.s.rows, (-999, y - YM, 999999, 999999)) self.setRegion(self.s.rows, (-999, y - YM, 999999, 999999))

View file

@ -9,7 +9,7 @@ use Test::Differences qw( eq_or_diff );
use String::ShellQuote qw/ shell_quote /; use String::ShellQuote qw/ shell_quote /;
# my $cmd = shell_quote( 'flake8', '.' ); # my $cmd = shell_quote( 'flake8', '.' );
my $cmd = shell_quote( 'flake8', glob('./pysollib/[a-i]*.py') ); my $cmd = shell_quote( 'flake8', glob('./pysollib/[a-l]*.py') );
# TEST # TEST
eq_or_diff( scalar(`$cmd`), '', "flake8 is happy with the code." ); eq_or_diff( scalar(`$cmd`), '', "flake8 is happy with the code." );