mirror of
https://github.com/shlomif/PySolFC.git
synced 2025-04-05 00:02:29 -04:00
Add King's Way game
This commit is contained in:
parent
ea0ce6f6f3
commit
6a32b1f2fa
10 changed files with 182 additions and 12 deletions
29
html-src/rules/kingsway.html
Normal file
29
html-src/rules/kingsway.html
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<h1>King's Way</h1>
|
||||||
|
<p>
|
||||||
|
Golf type. 2 decks. 1 redeal.
|
||||||
|
|
||||||
|
<h3>Object</h3>
|
||||||
|
<p>
|
||||||
|
Move all cards except the kings to the waste stack.
|
||||||
|
|
||||||
|
<h3>Rules</h3>
|
||||||
|
<p>
|
||||||
|
Deal the eight kings to eight tableau piles. Then, deal five cards on
|
||||||
|
top of each king - the bottom-most one face-down and the others face-up.
|
||||||
|
<p>
|
||||||
|
Deal cards from the talon one at a time. You can move cards from the
|
||||||
|
tableau to build the waste stack up or down by alternate color. Kings
|
||||||
|
cannot be moved to the waste stack.
|
||||||
|
<p>
|
||||||
|
There is an additional reserve pile. Aces from the waste stack (not the
|
||||||
|
tableau) may be moved to this reserve. This reserve controls a single
|
||||||
|
redeal - when the talon is empty, you can take one card from the bottom
|
||||||
|
of the tableau for each card in the reserve, and use these cards to
|
||||||
|
build a new talon. You can only do this once.
|
||||||
|
<p>
|
||||||
|
The game is won if all cards are moved to the waste pile, except for the
|
||||||
|
immovable kings.
|
||||||
|
|
||||||
|
<h3>Notes</h3>
|
||||||
|
<p>
|
||||||
|
<i>Autodrop</i> is disabled for this game.
|
|
@ -3,7 +3,7 @@ msgstr ""
|
||||||
"Project-Id-Version: PySol 0.0.1\n"
|
"Project-Id-Version: PySol 0.0.1\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-12-10 10:19-0500\n"
|
"POT-Creation-Date: 2021-12-10 10:19-0500\n"
|
||||||
"PO-Revision-Date: 2024-06-30 10:00-0400\n"
|
"PO-Revision-Date: 2024-07-04 17:03-0400\n"
|
||||||
"Last-Translator: H. Schaekel <Holger.Schaekel@web.de>\n"
|
"Last-Translator: H. Schaekel <Holger.Schaekel@web.de>\n"
|
||||||
"Language-Team: German\n"
|
"Language-Team: German\n"
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
|
@ -2367,6 +2367,9 @@ msgstr "Basiskarte - Ass oder König."
|
||||||
msgid "Waste. Build up or down regardless of suit."
|
msgid "Waste. Build up or down regardless of suit."
|
||||||
msgstr "Zwischentalon. Hoch oder Runter unabhängig der Farbe zu erstelle."
|
msgstr "Zwischentalon. Hoch oder Runter unabhängig der Farbe zu erstelle."
|
||||||
|
|
||||||
|
msgid "Waste. Build up or down by alternate color."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pysollib/games/klondike.py:125
|
#: pysollib/games/klondike.py:125
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Balance $%d"
|
msgid "Balance $%d"
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgstr ""
|
||||||
"Project-Id-Version: 1.02\n"
|
"Project-Id-Version: 1.02\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-12-10 10:19-0500\n"
|
"POT-Creation-Date: 2021-12-10 10:19-0500\n"
|
||||||
"PO-Revision-Date: 2024-06-30 09:59-0400\n"
|
"PO-Revision-Date: 2024-07-04 17:03-0400\n"
|
||||||
"Last-Translator: Eric Rausch <neelix570@gmail.com>\n"
|
"Last-Translator: Eric Rausch <neelix570@gmail.com>\n"
|
||||||
"Language-Team: French\n"
|
"Language-Team: French\n"
|
||||||
"Language: fr\n"
|
"Language: fr\n"
|
||||||
|
@ -2407,6 +2407,9 @@ msgstr "Carte de départ - As ou Roi."
|
||||||
msgid "Waste. Build up or down regardless of suit."
|
msgid "Waste. Build up or down regardless of suit."
|
||||||
msgstr "Défausse. Croissant ou décroissant indépendamment de l'enseigne."
|
msgstr "Défausse. Croissant ou décroissant indépendamment de l'enseigne."
|
||||||
|
|
||||||
|
msgid "Waste. Build up or down by alternate color."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pysollib/games/klondike.py:125
|
#: pysollib/games/klondike.py:125
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Balance $%d"
|
msgid "Balance $%d"
|
||||||
|
|
|
@ -12,7 +12,7 @@ msgstr ""
|
||||||
"Project-Id-Version: it_pysol\n"
|
"Project-Id-Version: it_pysol\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-12-10 10:19-0500\n"
|
"POT-Creation-Date: 2021-12-10 10:19-0500\n"
|
||||||
"PO-Revision-Date: 2024-06-30 09:59-0400\n"
|
"PO-Revision-Date: 2024-07-04 17:03-0400\n"
|
||||||
"Last-Translator: Giuliano Colla <giuliano.colla@gmail.com>\n"
|
"Last-Translator: Giuliano Colla <giuliano.colla@gmail.com>\n"
|
||||||
"Language-Team: Italiano <it@li.org>\n"
|
"Language-Team: Italiano <it@li.org>\n"
|
||||||
"Language: it\n"
|
"Language: it\n"
|
||||||
|
@ -2415,6 +2415,9 @@ msgstr "Carta Base - Asso o Re"
|
||||||
msgid "Waste. Build up or down regardless of suit."
|
msgid "Waste. Build up or down regardless of suit."
|
||||||
msgstr "Pozzo: Sequenza crescente o decrescente indipendentemente dal seme"
|
msgstr "Pozzo: Sequenza crescente o decrescente indipendentemente dal seme"
|
||||||
|
|
||||||
|
msgid "Waste. Build up or down by alternate color."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pysollib/games/klondike.py:125
|
#: pysollib/games/klondike.py:125
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Balance $%d"
|
msgid "Balance $%d"
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgstr ""
|
||||||
"Project-Id-Version: PySolFC\n"
|
"Project-Id-Version: PySolFC\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-12-10 10:19-0500\n"
|
"POT-Creation-Date: 2021-12-10 10:19-0500\n"
|
||||||
"PO-Revision-Date: 2024-06-30 09:58-0400\n"
|
"PO-Revision-Date: 2024-07-04 17:03-0400\n"
|
||||||
"Last-Translator: Jerzy Trzeciak <artusek@wp.pl>\n"
|
"Last-Translator: Jerzy Trzeciak <artusek@wp.pl>\n"
|
||||||
"Language-Team: Polish <pl@li.org>\n"
|
"Language-Team: Polish <pl@li.org>\n"
|
||||||
"Language: pl\n"
|
"Language: pl\n"
|
||||||
|
@ -2421,6 +2421,9 @@ msgstr "Karta bazowa - As lub Król."
|
||||||
msgid "Waste. Build up or down regardless of suit."
|
msgid "Waste. Build up or down regardless of suit."
|
||||||
msgstr "Zrzut. Układaj w górę lub w dół niezależnie od koloru."
|
msgstr "Zrzut. Układaj w górę lub w dół niezależnie od koloru."
|
||||||
|
|
||||||
|
msgid "Waste. Build up or down by alternate color."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pysollib/games/klondike.py:125
|
#: pysollib/games/klondike.py:125
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Balance $%d"
|
msgid "Balance $%d"
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-12-10 10:19-0500\n"
|
"POT-Creation-Date: 2021-12-10 10:19-0500\n"
|
||||||
"PO-Revision-Date: 2024-06-30 09:58-0400\n"
|
"PO-Revision-Date: 2024-07-04 17:04-0400\n"
|
||||||
"Last-Translator: Matheus Knack <mtknack555@gmail.com>\n"
|
"Last-Translator: Matheus Knack <mtknack555@gmail.com>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"Language: pt_BR\n"
|
"Language: pt_BR\n"
|
||||||
|
@ -2429,6 +2429,9 @@ msgid "Waste. Build up or down regardless of suit."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Descarte. Construa crescente ou descrescente independentemente de naipe."
|
"Descarte. Construa crescente ou descrescente independentemente de naipe."
|
||||||
|
|
||||||
|
msgid "Waste. Build up or down by alternate color."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pysollib/games/klondike.py:125
|
#: pysollib/games/klondike.py:125
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Balance $%d"
|
msgid "Balance $%d"
|
||||||
|
|
|
@ -2254,6 +2254,9 @@ msgstr ""
|
||||||
msgid "Waste. Build up or down regardless of suit."
|
msgid "Waste. Build up or down regardless of suit."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Waste. Build up or down by alternate color."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pysollib/games/klondike.py:125
|
#: pysollib/games/klondike.py:125
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Balance $%d"
|
msgid "Balance $%d"
|
||||||
|
|
|
@ -7,7 +7,7 @@ msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-12-10 10:19-0500\n"
|
"POT-Creation-Date: 2021-12-10 10:19-0500\n"
|
||||||
"PO-Revision-Date: 2024-06-30 09:58-0400\n"
|
"PO-Revision-Date: 2024-07-04 17:04-0400\n"
|
||||||
"Last-Translator: Skomoroh <skomoroh@gmail.com>\n"
|
"Last-Translator: Skomoroh <skomoroh@gmail.com>\n"
|
||||||
"Language-Team: Russian <ru@li.org>\n"
|
"Language-Team: Russian <ru@li.org>\n"
|
||||||
"Language: ru\n"
|
"Language: ru\n"
|
||||||
|
@ -2414,6 +2414,9 @@ msgstr "Базовая карта - Туз или Король."
|
||||||
msgid "Waste. Build up or down regardless of suit."
|
msgid "Waste. Build up or down regardless of suit."
|
||||||
msgstr "Сброс. Складывать по возрастанию или убыванию не считаясь с мастью."
|
msgstr "Сброс. Складывать по возрастанию или убыванию не считаясь с мастью."
|
||||||
|
|
||||||
|
msgid "Waste. Build up or down by alternate color."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: pysollib/games/klondike.py:125
|
#: pysollib/games/klondike.py:125
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Balance $%d"
|
msgid "Balance $%d"
|
||||||
|
|
|
@ -604,7 +604,7 @@ class GI:
|
||||||
tuple(range(13168, 13170)) + tuple(range(18000, 18005)) +
|
tuple(range(13168, 13170)) + tuple(range(18000, 18005)) +
|
||||||
tuple(range(19000, 19012)) + tuple(range(22303, 22311)) +
|
tuple(range(19000, 19012)) + tuple(range(22303, 22311)) +
|
||||||
tuple(range(22353, 22361))),
|
tuple(range(22353, 22361))),
|
||||||
('dev', tuple(range(961, 965))),
|
('dev', tuple(range(961, 966))),
|
||||||
)
|
)
|
||||||
|
|
||||||
# deprecated - the correct way is to or a GI.GT_XXX flag
|
# deprecated - the correct way is to or a GI.GT_XXX flag
|
||||||
|
|
|
@ -136,8 +136,12 @@ class Golf_RowStack(BasicRowStack):
|
||||||
class Golf(Game):
|
class Golf(Game):
|
||||||
Solver_Class = BlackHoleSolverWrapper(preset='golf', base_rank=0,
|
Solver_Class = BlackHoleSolverWrapper(preset='golf', base_rank=0,
|
||||||
queens_on_kings=True)
|
queens_on_kings=True)
|
||||||
|
Talon_Class = Golf_Talon
|
||||||
Waste_Class = Golf_Waste
|
Waste_Class = Golf_Waste
|
||||||
Hint_Class = Golf_Hint
|
Hint_Class = Golf_Hint
|
||||||
|
Reserve_Class = None
|
||||||
|
|
||||||
|
ROUNDS = 1
|
||||||
|
|
||||||
#
|
#
|
||||||
# game layout
|
# game layout
|
||||||
|
@ -161,13 +165,18 @@ class Golf(Game):
|
||||||
x, y = layout.XM + layout.XS // 2, layout.YM
|
x, y = layout.XM + layout.XS // 2, layout.YM
|
||||||
for i in range(columns):
|
for i in range(columns):
|
||||||
s.rows.append(Golf_RowStack(x, y, self))
|
s.rows.append(Golf_RowStack(x, y, self))
|
||||||
x = x + layout.XS
|
x += layout.XS
|
||||||
x, y = layout.XM, self.height - layout.YS
|
x, y = layout.XM, self.height - layout.YS
|
||||||
s.talon = Golf_Talon(x, y, self, max_rounds=1)
|
s.talon = self.Talon_Class(x, y, self, max_rounds=self.ROUNDS)
|
||||||
layout.createText(s.talon, "n")
|
layout.createText(s.talon, "n")
|
||||||
x = x + layout.XS
|
x += layout.XS
|
||||||
s.waste = self.Waste_Class(x, y, self)
|
s.waste = self.Waste_Class(x, y, self)
|
||||||
s.waste.CARD_XOFFSET = layout.XOFFSET
|
if self.Reserve_Class is None:
|
||||||
|
s.waste.CARD_XOFFSET = layout.XOFFSET
|
||||||
|
else:
|
||||||
|
x += layout.XS
|
||||||
|
s.reserves.append(self.Reserve_Class(x, y, self))
|
||||||
|
layout.createText(s.reserves[0], "n")
|
||||||
layout.createText(s.waste, "n")
|
layout.createText(s.waste, "n")
|
||||||
# the Waste is also our only Foundation in this game
|
# the Waste is also our only Foundation in this game
|
||||||
s.foundations.append(s.waste)
|
s.foundations.append(s.waste)
|
||||||
|
@ -176,6 +185,9 @@ class Golf(Game):
|
||||||
self.sg.openstacks = [s.waste]
|
self.sg.openstacks = [s.waste]
|
||||||
self.sg.talonstacks = [s.talon]
|
self.sg.talonstacks = [s.talon]
|
||||||
self.sg.dropstacks = s.rows
|
self.sg.dropstacks = s.rows
|
||||||
|
if self.Reserve_Class is not None:
|
||||||
|
self.sg.openstacks += s.reserves
|
||||||
|
self.sg.reservestacks = s.reserves
|
||||||
|
|
||||||
#
|
#
|
||||||
# game overrides
|
# game overrides
|
||||||
|
@ -228,7 +240,9 @@ class Thieves(Golf):
|
||||||
|
|
||||||
|
|
||||||
# ************************************************************************
|
# ************************************************************************
|
||||||
# *
|
# * Dead King Golf
|
||||||
|
# * Relaxed Golf
|
||||||
|
# * Double Putt
|
||||||
# ************************************************************************
|
# ************************************************************************
|
||||||
|
|
||||||
class DeadKingGolf(Golf):
|
class DeadKingGolf(Golf):
|
||||||
|
@ -259,6 +273,110 @@ class DoublePutt(DoubleGolf):
|
||||||
shallHighlightMatch = Game._shallHighlightMatch_RKW
|
shallHighlightMatch = Game._shallHighlightMatch_RKW
|
||||||
|
|
||||||
|
|
||||||
|
# ************************************************************************
|
||||||
|
# * King's Way
|
||||||
|
# ************************************************************************
|
||||||
|
|
||||||
|
class KingsWay_Talon(Golf_Talon):
|
||||||
|
def _redeal(self):
|
||||||
|
game = self.game
|
||||||
|
num_redeal = len(game.s.reserves[0].cards)
|
||||||
|
# TODO: I know there's a better way to do this.
|
||||||
|
while len(game.s.waste.cards) > 0:
|
||||||
|
game.moveMove(1, self.waste, game.s.reserves[0], frames=0)
|
||||||
|
for i in range(num_redeal):
|
||||||
|
game.moveMove(1, game.s.reserves[0], self, frames=0)
|
||||||
|
if self.cards[-1].face_up:
|
||||||
|
game.flipMove(self)
|
||||||
|
while len(game.s.reserves[0].cards) > num_redeal:
|
||||||
|
game.moveMove(1, game.s.reserves[0], self.waste, frames=0)
|
||||||
|
self.game.nextRoundMove(self)
|
||||||
|
self.dealCards()
|
||||||
|
|
||||||
|
def canDealCards(self):
|
||||||
|
return (len(self.cards) > 0
|
||||||
|
or (self.round == 1 and len(self.cards) == 0
|
||||||
|
and len(self.game.s.reserves[0].cards) > 0))
|
||||||
|
|
||||||
|
def dealCards(self, sound=False):
|
||||||
|
if self.cards:
|
||||||
|
return WasteTalonStack.dealCards(self, sound=sound)
|
||||||
|
if sound:
|
||||||
|
self.game.startDealSample()
|
||||||
|
self._redeal()
|
||||||
|
if sound:
|
||||||
|
self.game.stopSamples()
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
class KingsWay_Waste(Golf_Waste):
|
||||||
|
|
||||||
|
def __init__(self, x, y, game, **cap):
|
||||||
|
kwdefault(cap, max_move=1, max_accept=1)
|
||||||
|
WasteStack.__init__(self, x, y, game, **cap)
|
||||||
|
|
||||||
|
def acceptsCards(self, from_stack, cards):
|
||||||
|
if self.cards[-1].color == cards[0].color:
|
||||||
|
return False
|
||||||
|
if cards[0].rank == KING:
|
||||||
|
return False
|
||||||
|
return Golf_Waste.acceptsCards(self, from_stack, cards)
|
||||||
|
|
||||||
|
def moveMove(self, ncards, to_stack, frames=-1, shadow=-1):
|
||||||
|
WasteStack.moveMove(self, ncards, to_stack, frames=frames,
|
||||||
|
shadow=shadow)
|
||||||
|
self.game.s.talon.dealCards()
|
||||||
|
|
||||||
|
def rightclickHandler(self, event):
|
||||||
|
if self.cards and self.cards[-1].rank == ACE:
|
||||||
|
self.playMoveMove(1, self.game.s.reserves[0])
|
||||||
|
|
||||||
|
def getHelp(self):
|
||||||
|
return _('Waste. Build up or down by alternate color.')
|
||||||
|
|
||||||
|
|
||||||
|
class KingsWay_Reserve(ReserveStack):
|
||||||
|
|
||||||
|
def getBottomImage(self):
|
||||||
|
return self.game.app.images.getLetter(ACE)
|
||||||
|
|
||||||
|
def acceptsCards(self, from_stack, cards):
|
||||||
|
return from_stack == self.game.s.waste and cards[0].rank == ACE
|
||||||
|
|
||||||
|
|
||||||
|
class KingsWay(Golf):
|
||||||
|
Solver_Class = None
|
||||||
|
|
||||||
|
Talon_Class = KingsWay_Talon
|
||||||
|
Waste_Class = KingsWay_Waste
|
||||||
|
Reserve_Class = StackWrapper(KingsWay_Reserve, max_accept=1)
|
||||||
|
|
||||||
|
ROUNDS = 2
|
||||||
|
|
||||||
|
def createGame(self):
|
||||||
|
Golf.createGame(self, 8)
|
||||||
|
|
||||||
|
def _shuffleHook(self, cards):
|
||||||
|
return self._shuffleHookMoveToTop(cards,
|
||||||
|
lambda c: (c.rank == KING, None))
|
||||||
|
|
||||||
|
def startGame(self):
|
||||||
|
self.s.talon.dealRow(rows=self.s.rows, frames=0)
|
||||||
|
self.s.talon.dealRow(rows=self.s.rows, flip=0, frames=0)
|
||||||
|
for i in range(2):
|
||||||
|
self.s.talon.dealRow(rows=self.s.rows, frames=0)
|
||||||
|
self.startDealSample()
|
||||||
|
for i in range(2):
|
||||||
|
self.s.talon.dealRow(rows=self.s.rows)
|
||||||
|
self.s.talon.dealCards() # deal first card to WasteStack
|
||||||
|
|
||||||
|
def isGameWon(self):
|
||||||
|
for r in self.s.rows:
|
||||||
|
if len(r.cards) != 1:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
# ************************************************************************
|
# ************************************************************************
|
||||||
# * Elevator - Relaxed Golf in a Pyramid layout
|
# * Elevator - Relaxed Golf in a Pyramid layout
|
||||||
# ************************************************************************
|
# ************************************************************************
|
||||||
|
@ -1562,3 +1680,5 @@ registerGame(GameInfo(941, BinaryStar, "Binary Star",
|
||||||
registerGame(GameInfo(959, DoubleUintah, "Double Uintah",
|
registerGame(GameInfo(959, DoubleUintah, "Double Uintah",
|
||||||
GI.GT_GOLF, 2, UNLIMITED_REDEALS,
|
GI.GT_GOLF, 2, UNLIMITED_REDEALS,
|
||||||
GI.SL_MOSTLY_LUCK))
|
GI.SL_MOSTLY_LUCK))
|
||||||
|
registerGame(GameInfo(965, KingsWay, "King's Way",
|
||||||
|
GI.GT_GOLF, 2, 1, GI.SL_MOSTLY_LUCK))
|
||||||
|
|
Loading…
Add table
Reference in a new issue