gnome-games r8329 - in trunk: aisleriot/help aisleriot/help/C aisleriot/rules po



Author: chpe
Date: Sun Nov 23 19:34:54 2008
New Revision: 8329
URL: http://svn.gnome.org/viewvc/gnome-games?rev=8329&view=rev

Log:
Bug 542641 â Add Terrace aka Queen of Italy
Written by Vincent Povirk with rules provided by David Rogers.

Added:
   trunk/aisleriot/help/C/terrace.xml
   trunk/aisleriot/rules/terrace.scm
Modified:
   trunk/aisleriot/help/C/aisleriot.xml
   trunk/aisleriot/help/Makefile.am
   trunk/po/POTFILES.in

Modified: trunk/aisleriot/help/C/aisleriot.xml
==============================================================================
--- trunk/aisleriot/help/C/aisleriot.xml	(original)
+++ trunk/aisleriot/help/C/aisleriot.xml	Sun Nov 23 19:34:54 2008
@@ -71,6 +71,7 @@
 <!ENTITY straight-up SYSTEM "straight_up.xml">
 <!ENTITY streets-and-alleys SYSTEM "streets_and_alleys.xml">
 <!ENTITY ten-across SYSTEM "ten_across.xml">
+<!ENTITY terrace SYSTEM "terrace.xml">
 <!ENTITY thieves SYSTEM "thieves.xml">
 <!ENTITY thirteen SYSTEM "thirteen.xml">
 <!ENTITY thumb-and-pouch SYSTEM "thumb_and_pouch.xml">
@@ -356,6 +357,7 @@
   &straight-up;
   &streets-and-alleys;
   &ten-across;
+  &terrace;
   &thieves;
   &thirteen;
   &thumb-and-pouch;

Added: trunk/aisleriot/help/C/terrace.xml
==============================================================================
--- (empty file)
+++ trunk/aisleriot/help/C/terrace.xml	Sun Nov 23 19:34:54 2008
@@ -0,0 +1,214 @@
+<sect1 id="Terrace"><!--<sect1info>
+		<copyright>
+			<year>2008</year>
+			<holder>David Rogers</holder>
+		</copyright>
+		<author>
+			<firstname>David</firstname>
+			<surname>Rogers</surname>
+		</author>
+		<address><email>ezekiel000 lavabit com</email></address>
+	</sect1info>-->
+
+	<title>Terrace</title>
+
+  <para>Written by David Rogers</para>
+
+          <sect2><title>Setup</title>
+
+
+  <informaltable>
+    <tgroup cols="2">
+      <tbody>
+	<row>
+	  <entry>Type of Deck</entry>
+	  <entry>Double Deck</entry>
+	</row>
+	<row>
+	  <entry>Stock</entry>
+	  <entry>
+	  	Top left pile. The rest of the deck is placed here after
+		dealing the Reserve and on to the Tableau. Cards are turned
+		over one at a time to Waste. Stock cannot be turned.
+	  </entry>
+	</row>
+	<row>
+	  <entry>Waste</entry>
+	  <entry>
+	  	To be taken from the Stock. Top card available for play.
+	  </entry>
+	</row>
+	<row>
+	  <entry>Reserve</entry>
+	  <entry>
+	  	Eleven cards dealt face up in a pile. All cards are visible
+		but only top card is in play.
+	  </entry>
+	</row>
+	<row>
+	  <entry>Foundation</entry>
+	  <entry>
+	  	Eight piles in the middle. To be built up in sequence by
+		alternating colours from the base card.
+	  </entry>
+	</row>
+	<row>
+	  <entry>Tableau</entry>
+    	  <entry>
+    		Nine cards dealt face up from the deck once based card is
+		selected.
+     	  </entry>
+	</row>
+      </tbody>
+    </tgroup>
+  </informaltable>
+
+          </sect2>
+        <sect2><title>Goal</title>
+
+  <para>
+    Move all cards to the Foundation piles.
+  </para>
+
+          </sect2>
+        <sect2><title>Rules</title>
+
+  <para>
+	Cards in the Tableau are built down in sequence by alternating
+	colours building round the corner. Groups of cards can't be moved.
+	An empty pile in the Tableau must be filled by the top card in
+	Waste or the next card from the Stock. Top cards can be moved to
+	the Foundation or other Tableau piles.
+  </para>
+  <para>
+	Foundations are built up in sequence by alternating colours from
+	the base card. Empty Foundations must be filled with the base card
+	that is selected by the user from four random cards as the first
+	move. Cards in Foundations are out of play.
+  </para>
+  <para>
+	Top card of the Reserve is in play and can only be moved to
+	Foundations.
+  </para>
+  <para>
+	Cards are flipped from the Stock to the Waste individually as many
+	times as you like unless there is a space in the tableau. If there
+	is a space in the tableau then only one card may be flipped from
+	the stock to the waste until the tableau is filled or the top card
+	of the waste is moved to the foundation or tableau. While the
+	stock is locked you can still move cards around on the tableau,
+	from the reserve and to the foundation. If the Waste is empty a
+	card from the Stock is automatically dealt. Top card in Waste is
+	in play. Stock cannot be turned.
+  </para>
+  <para>
+	Double clicking on a card will move it to the appropriate
+	Foundation pile if such a move is possible.
+  </para>
+
+          </sect2>
+        <sect2><title>Options</title>
+
+  <para>
+	There are seven ways to play. The difference between them is in
+	number of Reserve cards, Tableau piles or choice of Base Card.
+  </para>
+  <para>
+	Terrace
+  </para>
+  <para>
+	Reserve of 11 cards, 9 Tableau piles. Foundations are built up in
+	sequence by alternating colours from the base card. User selection
+	of the base card from a choice of four at the start of the game and
+	one card is dealt to each Tableau pile. Stock cannot be turned.
+  </para>
+  <para>
+	General Patience
+  </para>
+  <para>
+	Reserve of 13 cards, 9 Tableau piles. Foundations are built up in
+	sequence by suit from the base card. User selection of the base
+	card from a choice of four at the start of the game and one card is
+	dealt to each Tableau pile. Stock can be turned once but the game
+	is lost if you cannot play each new card after its turned.
+  </para>
+  <para>
+	Falling Stars
+  </para>
+  <para>
+	Reserve of 11 cards, 9 Tableau piles. Foundations are built up in
+	sequence by alternating colours from the base card. At the start of
+	the game a base card is selected automatically and one card is
+	dealt to each Tableau pile. Stock cannot be turned.
+  </para>
+  <para>
+	Signora
+  </para>
+  <para>
+	Reserve of 11 cards, 9 Tableau piles. Foundations are built up in
+	sequence by alternating colours from the base card. At the start of
+	the game a base card is selected automatically and one card is
+	dealt to each Tableau pile. Spaces in the Tableau are automatically
+	filled from the Waste or Stock if the Waste is empty. Stock cannot
+	be turned.
+  </para>
+  <para>
+	Redheads
+  </para>
+  <para>
+	Reserve of 21 cards, 8 Tableau piles. Foundations are built up in
+	sequence by alternating colours from the base card. At the start of
+	the game a base card is selected automatically and one card is
+	dealt to each Tableau pile. Spaces in the Tableau are automatically
+	filled from the Reserve or any card if the Reserve is empty. Stock
+	cannot be turned.
+  </para>
+  <para>
+	Blondes and Brunettes
+  </para>
+  <para>
+	Reserve of 10 cards, 8 Tableau piles. Foundations are built up in
+	sequence by alternating colours from the base card. At the start of
+	the game a base card is selected automatically and one card is
+	dealt to each Tableau pile. Stock cannot be turned.
+  </para>
+  <para>
+	Wood
+  </para>
+  <para>
+	Reserve of 10 cards, 9 Tableau piles. Foundations are built up in
+	sequence by alternating colours from the base card. At the start of
+	the game a base card is selected automatically and one card is
+	dealt to each Tableau pile. Stock cannot be turned.
+  </para>
+
+          </sect2>
+        <sect2><title>Scoring</title>
+
+  <para>
+	Each card in the Foundation piles scores one point.
+  </para>
+
+          </sect2>
+        <sect2><title>Strategy</title>
+
+  <para>
+	When the game starts examine the Reserve carefully before choosing
+	your base card, avoid base cards that have several buried in the
+	Reserve.
+  </para>
+  <para>
+	Watch for reversed sequences in the Stock, Reserve a Foundation to
+	remove each reversed sequence.
+  </para>
+  <para>
+	Try to start Tableau piles from the last card needed to complete a
+	Foundation.
+  </para>
+  <para>
+	Remember that you can continue to flip cards from the stock while
+	it is locked without filling the tableau by using the top card of
+	the waste.
+  </para>
+        </sect2>
+</sect1>

Modified: trunk/aisleriot/help/Makefile.am
==============================================================================
--- trunk/aisleriot/help/Makefile.am	(original)
+++ trunk/aisleriot/help/Makefile.am	Sun Nov 23 19:34:54 2008
@@ -79,6 +79,7 @@
 	straight_up.xml \
 	streets_and_alleys.xml \
 	ten_across.xml \
+	terrace.xml \
 	thieves.xml \
 	thirteen.xml \
 	thumb_and_pouch.xml \

Added: trunk/aisleriot/rules/terrace.scm
==============================================================================
--- (empty file)
+++ trunk/aisleriot/rules/terrace.scm	Sun Nov 23 19:34:54 2008
@@ -0,0 +1,406 @@
+; AisleRiot - terrace.scm
+; Copyright (C) 2008 Vincent Povirk <madewokherd gmail com>
+;
+; This game is free software; you can redistribute it and/or modify
+; it under the terms of the GNU General Public License as published by
+; the Free Software Foundation; either version 2, or (at your option)
+; any later version.
+;
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+; GNU General Public License for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with this program; if not, write to the Free Software
+; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+; USA
+
+(define reserve-size 11)
+(define tableau-size 9)
+(define build-foundation-in-suit #f)
+(define select-base #t)
+(define max-redeal 0)
+(define auto-fill-tableau #f)
+(define fill-from-reserve #f)
+
+(define variations
+  '((11 9 #f #t 0 #f #f)
+    (13 9 #t #t 1 #f #f)
+    (11 9 #f #f 0 #f #f)
+    (11 9 #f #f 0 #t #f)
+    (21 8 #f #f 0 #t #t)
+    (10 8 #f #f 0 #f #f)
+    (10 9 #f #f 0 #f #f)))
+
+(define variation-names
+  (list (_"Terrace")
+        (_"General Patience")
+        (_"Falling Stars")
+        (_"Signora")
+        (_"Redheads")
+        (_"Blondes and Brunettes")
+        (_"Wood")))
+
+(define current-variation 0)
+
+(def-save-var BASE-VAL 0)
+
+; In games where the tableau is not auto-filled, the stock is "locked" when a
+; card is dealt while the tableau has an empty space and "unlocked" when spaces
+; are full or a card is moved out of the waste.
+(def-save-var stock-locked #f)
+
+(define stock 0)
+(define waste 1)
+(define reserve 2)
+(define foundation '(3 4 5 6 7 8 9 10))
+(define tableau '()) ; This will be set by (new-game)
+
+(define (new-game)
+  (initialize-playing-area)
+  (set-ace-low)
+
+  (make-standard-double-deck)
+  (shuffle-deck)
+  
+  (add-normal-slot (reverse DECK))
+  (add-normal-slot '())
+  (add-blank-slot)
+  (add-extended-slot '() right)
+  (add-carriage-return-slot)
+
+  (add-normal-slot '())
+  (add-normal-slot '())
+  (add-normal-slot '())
+  (add-normal-slot '())
+  (add-normal-slot '())
+  (add-normal-slot '())
+  (add-normal-slot '())
+  (add-normal-slot '())
+  (add-carriage-return-slot)
+
+  (set! tableau '())
+  (build-tableau-slots tableau-size)
+  (set! tableau (reverse tableau))
+
+  (deal-reserve-cards reserve-size)
+
+  (if select-base
+      (begin (deal-tableau-cards tableau 4)
+             (set! BASE-VAL 0))
+      (begin (deal-cards-face-up stock (list (car foundation)))
+             (set! BASE-VAL (get-value (get-top-card (car foundation))))
+             (deal-tableau-cards tableau tableau-size)))
+
+  (do-auto-deal)
+  (give-status-message)
+  (update-score)
+
+  (list 8 4.1)
+)
+
+(define (build-tableau-slots count)
+  (and (not (= count 0))
+       (set! tableau (cons SLOTS tableau))
+       (add-extended-slot '() down)
+       (set! HORIZPOS (+ HORIZPOS (- 1 (/ tableau-size 8))))
+       (build-tableau-slots (- count 1))))
+
+(define (deal-reserve-cards count)
+  (and (not (= count 0))
+       (deal-cards-face-up stock (list reserve))
+       (deal-reserve-cards (- count 1))))
+
+(define (deal-tableau-cards slots count)
+  (and (not (= count 0))
+       (not (null? slots))
+       (deal-cards-face-up stock (list (car slots)))
+       (deal-tableau-cards (cdr slots) (- count 1))))
+
+
+(define (give-status-message)
+  (set-statusbar-message (string-append (get-stock-no-string)
+                                        (get-redeals-string)
+                                        "   "
+                                        (get-base-string))))
+
+(define (get-base-string)
+  (cond ((and (> BASE-VAL 1)
+              (< BASE-VAL 11))
+         (format (_"Base Card: ~a") (number->string BASE-VAL)))
+        ((= BASE-VAL 1)
+         (_"Base Card: Ace"))
+        ((= BASE-VAL 11)
+         (_"Base Card: Jack"))
+        ((= BASE-VAL 12)
+         (_"Base Card: Queen"))
+        ((= BASE-VAL 13)
+         (_"Base Card: King"))
+        (#t "")))
+
+(define (get-redeals-string)
+  (if (or (< max-redeal 1) (= BASE-VAL 0))
+      ""
+      (string-append "   " (_"Redeals left:") " "
+                     (number->string (- max-redeal FLIP-COUNTER)))))
+
+(define (get-stock-no-string)
+  (if (= BASE-VAL 0)
+      ""
+      (string-append (_"Stock left:") " " 
+                     (number->string (length (get-cards stock))))))
+
+(define (descending-values? a b)
+   (or (= b (- a 1))
+       (and (= a ace)
+            (= b king))))
+
+(define (calculate-score slots acc)
+  (if (null? slots)
+      acc
+      (calculate-score (cdr slots) (+ acc (length (get-cards (car slots)))))))
+
+(define (update-score)
+  (set-score! (calculate-score foundation 0)))
+
+(define (do-auto-fill-tableau slots)
+  (if (null? slots)
+      #t
+      (begin (and (empty-slot? (car slots))
+                  (cond ((and fill-from-reserve (not (empty-slot? reserve)))
+                         (deal-cards-face-up reserve (list (car slots))))
+                        ((not (empty-slot? waste))
+                         (deal-cards-face-up waste (list (car slots))))
+                        ((not (empty-slot? stock))
+                         (deal-cards-face-up stock (list (car slots))))))
+             (do-auto-fill-tableau (cdr slots)))))
+
+(define (do-auto-deal)
+  (or (= BASE-VAL 0)
+      (not auto-fill-tableau)
+      (do-auto-fill-tableau tableau))
+  (or (= BASE-VAL 0)
+      (not (empty-slot? waste))
+      (not (dealable?))
+      (do-deal-next-cards))
+  #t)
+
+(define (button-pressed slot-id card-list)
+  (cond ((= BASE-VAL 0) ; If we haven't selected a base, nothing else is allowed
+         (member slot-id tableau))
+        ((member slot-id tableau)
+         (= 1 (length card-list)))
+        ((= slot-id reserve)
+         #t)
+        ((= slot-id waste)
+         #t)
+        (#t #f)))
+
+(define (complete-transaction start-slot card-list end-slot)
+  (move-n-cards! start-slot end-slot card-list)
+  (or (not (= BASE-VAL 0))
+      (begin (set! BASE-VAL (get-value (get-top-card end-slot)))
+             (do-auto-fill-tableau tableau)))
+  (and (or (= start-slot waste)
+           (not (or-map empty-slot? tableau)))
+       (set! stock-locked #f))
+  (do-auto-deal)
+  #t)
+
+(define (button-released start-slot card-list end-slot)
+  (and (droppable? start-slot card-list end-slot)
+       (complete-transaction start-slot card-list end-slot)))
+
+(define (droppable? start-slot card-list end-slot)
+  (cond ((= BASE-VAL 0) ; If we haven't selected a base, nothing else is allowed
+         (and (member start-slot tableau)
+              (member end-slot foundation)))
+        ((= start-slot stock)
+         #f)
+        ((member end-slot tableau)
+         (and (= 1 (length card-list))
+              (not (= start-slot end-slot))
+              (not (= start-slot reserve))
+              (if (empty-slot? end-slot)
+                  (= start-slot waste)
+                  (and (not (= (get-color (car card-list))
+                               (get-color (get-top-card end-slot))))
+                       (descending-values? (get-value (get-top-card end-slot))
+                                           (get-value (car card-list)))
+                       (not (= (get-value (get-top-card end-slot)) BASE-VAL))))))
+        ((member end-slot foundation)
+         (if (empty-slot? end-slot)
+             (= BASE-VAL (get-value (car card-list)))
+             (and (if build-foundation-in-suit
+                      (= (get-suit (car card-list))
+                         (get-suit (get-top-card end-slot)))
+                      (not (= (get-color (car card-list))
+                              (get-color (get-top-card end-slot)))))
+                  (descending-values? (get-value (car card-list))
+                                      (get-value (get-top-card end-slot)))
+                  (not (= (get-value (car card-list)) BASE-VAL)))))
+        (#t #f)))
+
+(define (dealable?)
+  (and (not (= 0 BASE-VAL))
+       (flippable? stock max-redeal)
+       ;Do not allow deals if we've been through the deck once and the waste is not empty
+       (or (< FLIP-COUNTER 1)
+           (empty-slot? waste))
+       (or auto-fill-tableau
+           (not stock-locked))))
+
+(define (do-deal-next-cards)
+  (and (dealable?)
+       (flip-stock stock waste max-redeal 1)
+       (or (not (or-map empty-slot? tableau))
+           (set! stock-locked #t))
+       #t))
+
+(define (button-clicked start-slot)
+  (and (= start-slot stock)
+       (do-deal-next-cards)
+       #t))
+
+(define (auto-play-to-foundation start-slot end-slots)
+  (and (not (null? end-slots))
+       (not (empty-slot? start-slot))
+       (if (droppable? start-slot (list (get-top-card start-slot)) (car end-slots))
+           (complete-transaction start-slot (list (remove-card start-slot)) (car end-slots))
+           (auto-play-to-foundation start-slot (cdr end-slots)))))
+
+(define (button-double-clicked start-slot)
+  (auto-play-to-foundation start-slot foundation))
+
+(define (hint-start-foundation)
+  (and (= BASE-VAL 0)
+       (list 2 (_"something") (_"the foundation"))))
+
+(define (hint-slot-to-foundation start-slot end-slots)
+  (and (not (null? end-slots))
+       (not (empty-slot? start-slot))
+       (if (droppable? start-slot (list (get-top-card start-slot)) (car end-slots))
+           (if (empty-slot? (car end-slots))
+               (list 2 (get-name (get-top-card start-slot)) (_"an empty slot on the foundation"))
+               (list 1 (get-name (get-top-card start-slot)) (get-name (get-top-card (car end-slots)))))
+           (hint-slot-to-foundation start-slot (cdr end-slots)))))
+
+(define (hint-slots-to-foundation start-slots)
+  (and (not (null? start-slots))
+       (or (hint-slot-to-foundation (car start-slots) foundation)
+           (hint-slots-to-foundation (cdr start-slots)))))
+
+(define (get-rank value)
+  (if (< value BASE-VAL)
+      (+ 13 value)
+      value))
+
+(define (droppable-on-foundation start-slot cards end-slots)
+  (and (not (null? end-slots))
+       (or (droppable? start-slot cards (car end-slots))
+           (droppable-on-foundation start-slot cards (cdr end-slots)))))
+
+; We need to check recursively for builds because it might be possible to free
+; a space in the tableau by moving multiple single cards in a row.
+(define (buildable-on-tableau start-slot cards acc)
+  (or (and (null? cards)
+           acc)
+      ; If the foundation is building in suit, it's possible that moving cards
+      ; within the tableau will allow putting something on a foundation
+      (and (droppable-on-foundation start-slot (list (car cards)) foundation)
+           acc)
+      (let ((target-slot (buildable-on-tableau-helper start-slot (car cards) tableau)))
+           (and target-slot
+                (buildable-on-tableau
+                     start-slot
+                     (cdr cards)
+                     (or acc (list (get-rank (get-value (car cards))) 1 (get-name (car cards)) (get-name (get-top-card target-slot)))))))))
+(define (buildable-on-tableau-helper start-slot card end-slots)
+  (and (not (null? end-slots))
+       (or (and (not (empty-slot? (car end-slots)))
+                (droppable? start-slot (list card) (car end-slots))
+                (car end-slots))
+           (buildable-on-tableau-helper start-slot card (cdr end-slots)))))
+
+(define (hint-tableau-build start-slots acc)
+  (if (null? start-slots)
+      (cdr acc)
+      ; Try to prefer moving cards of higher rank
+      (let ((hint (hint-tableau-build-helper (car start-slots))))
+           (hint-tableau-build
+               (cdr start-slots)
+               (if (and hint (> (car hint) (car acc)))
+                   hint
+                   acc)))))
+             
+            
+(define (hint-tableau-build-helper start-slot)
+  (and (not (empty-slot? start-slot))
+       (buildable-on-tableau start-slot (get-cards start-slot) #f)))
+
+(define (hint-waste-to-tableau end-slots)
+  (and (not (null? end-slots))
+       (not (empty-slot? waste))
+       (if (droppable? waste (list (get-top-card waste)) (car end-slots))
+           (if (empty-slot? (car end-slots))
+               (list 2 (get-name (get-top-card waste)) (_"an empty slot on the tableau"))
+               (list 1 (get-name (get-top-card waste)) (get-name (get-top-card (car end-slots)))))
+           (hint-waste-to-tableau (cdr end-slots)))))
+
+(define (hint-deal)
+  (and (dealable?)
+       (list 0 (_"Deal a new card from the deck"))))
+
+(define (get-hint)
+  (or (hint-start-foundation)
+      (hint-slot-to-foundation reserve foundation)
+      (hint-slots-to-foundation tableau)
+      (hint-slot-to-foundation waste foundation)
+      (hint-tableau-build tableau (cons BASE-VAL #f))
+      (hint-waste-to-tableau tableau)
+      (hint-deal)))
+
+(define (game-won)
+  (= (get-score) 104))
+
+(define (game-continuable)
+  (give-status-message)
+  (update-score)
+  (and (not (game-won))
+       (get-hint)))
+
+(define (get-variation-options names index)
+  (if (null? names)
+      '()
+      (cons (list (car names) (= current-variation index))
+            (get-variation-options (cdr names) (+ 1 index)))))
+
+(define (get-options)
+  (append '(begin-exclusive)
+          (get-variation-options variation-names 0)
+          '(end-exclusive)))
+
+(define (set-variation vars options index)
+  (or (null? vars)
+      (and (cadar options)
+           (set! current-variation index)
+           (set! reserve-size (list-ref (car vars) 0))
+           (set! tableau-size (list-ref (car vars) 1))
+           (set! build-foundation-in-suit (list-ref (car vars) 2))
+           (set! select-base (list-ref (car vars) 3))
+           (set! max-redeal (list-ref (car vars) 4))
+           (set! auto-fill-tableau (list-ref (car vars) 5))
+           (set! fill-from-reserve (list-ref (car vars) 6)))
+      (set-variation (cdr vars) (cdr options) (+ index 1))))
+
+(define (apply-options options)
+  (set-variation variations (cdr options) 0))
+
+(define (timeout) #f)
+
+(set-features droppable-feature dealable-feature)
+
+(set-lambda new-game button-pressed button-released button-clicked button-double-clicked game-continuable game-won get-hint get-options apply-options timeout droppable? dealable?)
+
+

Modified: trunk/po/POTFILES.in
==============================================================================
--- trunk/po/POTFILES.in	(original)
+++ trunk/po/POTFILES.in	Sun Nov 23 19:34:54 2008
@@ -83,6 +83,7 @@
 aisleriot/rules/straight_up.scm
 aisleriot/rules/streets_and_alleys.scm
 aisleriot/rules/ten_across.scm
+aisleriot/rules/terrace.scm
 aisleriot/rules/thieves.scm
 aisleriot/rules/thirteen.scm
 aisleriot/rules/thumb_and_pouch.scm



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]