[bknr-cvs] r2211 - in branches/trunk-reorg/bknr/projects: . scrabble scrabble/src scrabble/website scrabble/website/de

bknr at bknr.net bknr at bknr.net
Thu Oct 4 21:34:38 UTC 2007


Author: hhubner
Date: 2007-10-04 17:34:36 -0400 (Thu, 04 Oct 2007)
New Revision: 2211

Added:
   branches/trunk-reorg/bknr/projects/scrabble/
   branches/trunk-reorg/bknr/projects/scrabble/scrabble_05.jpg
   branches/trunk-reorg/bknr/projects/scrabble/src/
   branches/trunk-reorg/bknr/projects/scrabble/src/load.lisp
   branches/trunk-reorg/bknr/projects/scrabble/src/make-html.lisp
   branches/trunk-reorg/bknr/projects/scrabble/src/make-letters.lisp
   branches/trunk-reorg/bknr/projects/scrabble/src/package.lisp
   branches/trunk-reorg/bknr/projects/scrabble/src/scrabble-test.lisp
   branches/trunk-reorg/bknr/projects/scrabble/src/scrabble.asd
   branches/trunk-reorg/bknr/projects/scrabble/src/scrabble.lisp
   branches/trunk-reorg/bknr/projects/scrabble/src/setup-registry.lisp
   branches/trunk-reorg/bknr/projects/scrabble/website/
   branches/trunk-reorg/bknr/projects/scrabble/website/de/
   branches/trunk-reorg/bknr/projects/scrabble/website/de/A.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/B.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/C.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/D.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/E.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/F.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/G.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/H.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/I.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/J.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/K.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/L.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/M.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/N.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/NIL.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/O.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/P.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/Q.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/R.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/S.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/T.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/U.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/V.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/W.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/X.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/Y.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/Z.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/double-letter.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/double-word.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/scrabble.css
   branches/trunk-reorg/bknr/projects/scrabble/website/de/standard.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/test.html
   branches/trunk-reorg/bknr/projects/scrabble/website/de/triple-letter.png
   branches/trunk-reorg/bknr/projects/scrabble/website/de/triple-word.png
Log:
Add Scrabble project


Added: branches/trunk-reorg/bknr/projects/scrabble/scrabble_05.jpg
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/scrabble_05.jpg
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/src/load.lisp
===================================================================
--- branches/trunk-reorg/bknr/projects/scrabble/src/load.lisp	2007-10-04 21:08:36 UTC (rev 2210)
+++ branches/trunk-reorg/bknr/projects/scrabble/src/load.lisp	2007-10-04 21:34:36 UTC (rev 2211)
@@ -0,0 +1,5 @@
+(in-package :cl-user)
+
+(load (merge-pathnames #p"../thirdparty/asdf.lisp" *load-truename*))
+
+(load (merge-pathnames #p"setup-registry.lisp" *load-truename*))
\ No newline at end of file

Added: branches/trunk-reorg/bknr/projects/scrabble/src/make-html.lisp
===================================================================
--- branches/trunk-reorg/bknr/projects/scrabble/src/make-html.lisp	2007-10-04 21:08:36 UTC (rev 2210)
+++ branches/trunk-reorg/bknr/projects/scrabble/src/make-html.lisp	2007-10-04 21:34:36 UTC (rev 2211)
@@ -0,0 +1,16 @@
+
+(in-package :scrabble)
+
+(defun make-playfield-html ()
+  (format t "<div id='playfield'>~%")
+  (dotimes (x 15)
+    (dotimes (y 15)
+      (format t " <div id='field-~A-~A'/><img src='A.png'/></div>~%"
+              x y)))
+  (format t "</div>~%"))
+
+(defun make-playfield-css ()
+  (dotimes (x 15)
+    (dotimes (y 15)
+      (format t "#playfield #field-~A-~A { background-image: url(~(~A.png~)); left: ~A; top: ~A }~%"
+              x y (field-type x y) (* 44 x) (* 44 y)))))
\ No newline at end of file

Added: branches/trunk-reorg/bknr/projects/scrabble/src/make-letters.lisp
===================================================================
--- branches/trunk-reorg/bknr/projects/scrabble/src/make-letters.lisp	2007-10-04 21:08:36 UTC (rev 2210)
+++ branches/trunk-reorg/bknr/projects/scrabble/src/make-letters.lisp	2007-10-04 21:34:36 UTC (rev 2211)
@@ -0,0 +1,72 @@
+
+(in-package :scrabble.graphics)
+
+(defparameter *special-tile-texts* (make-hash-table))
+
+(setf (gethash :de *special-tile-texts*)
+      '(:double-letter "DOPPELTER\nBUCHSTABEN\nWERT"
+        :double-word "DOPPELTER\nWORT\nWERT"
+        :triple-letter "DREIFACHER\nBUCHSTABEN\nWERT"
+        :triple-word "DREIFACHER\nWORT\nWERT"))
+
+(defparameter *special-tile-colors*
+  '(:double-letter (0.53 0.8 0.94)
+    :double-word (0.97 0.67 0.6)
+    :triple-letter (0.0 0.62 0.87)
+    :triple-word (0.93 0.11 0.18)
+    :standard (0.0 0.59 0.57)))
+
+(defparameter *bold-font* #.(merge-pathnames #p"../fonts/DIN/DINMd___.ttf" *default-pathname-defaults*))
+(defparameter *regular-font* #.(merge-pathnames #p"../fonts/DIN/DINRg___.ttf" *default-pathname-defaults*))
+
+(defun make-letter-tile (char score)
+  (with-canvas (:width 34 :height 34)
+    (let ((bold-font (get-font *bold-font*))
+          (regular-font (get-font *regular-font*))
+          (char-string (make-string 1 :initial-element char)))
+      (set-rgb-fill 1.0 0.98 0.8)
+      (rounded-rectangle 0 0 34 34 4 4)
+      (fill-path)
+      (set-rgb-fill 0 0 0)
+      (set-font bold-font 27)
+      (draw-centered-string 13 7 char-string)
+      (set-font regular-font 11)
+      (draw-centered-string 26 3 (princ-to-string score))
+      (save-png (make-pathname :name char-string :type "png")))))
+
+(defun make-letter-tile-set (language)
+  (dolist (entry (gethash language *tile-sets*))
+    (destructuring-bind (letter score count) entry
+      (declare (ignore count))
+      (make-letter-tile letter score))))
+
+(defun make-special-tile (name color &key text star)
+  (with-canvas (:width 40 :height 40)
+    (let ((regular-font (get-font *regular-font*)))
+      (apply #'set-rgb-fill color)
+      (rounded-rectangle 0 0 40 40 5 5)
+      (fill-path)
+      (set-rgb-fill 0 0 0)
+      (cond
+        (text
+         (set-font regular-font 6)
+         (draw-centered-string 26 3 text))
+        (star
+         ))
+      (save-png (make-pathname :name (string-downcase (symbol-name name)) :type "png")))))
+
+(defun make-special-tile-set (language)
+  (dolist (tile-name '(:double-letter :double-word :triple-letter :triple-word))
+    (make-special-tile tile-name
+                       (getf *special-tile-colors* tile-name)
+                       :text (getf (gethash language *special-tile-texts*) tile-name)))
+  (make-special-tile :standard (getf *special-tile-colors* :standard) :star t))
+
+
+(defun make-tile-set (language)
+  (let ((*default-pathname-defaults* (merge-pathnames
+                                      (make-pathname :directory (list :relative
+                                                                      (string-downcase (symbol-name language)))))))
+    (ensure-directories-exist *default-pathname-defaults*)
+    (make-letter-tile-set language)
+    (make-special-tile-set language)))
\ No newline at end of file

Added: branches/trunk-reorg/bknr/projects/scrabble/src/package.lisp
===================================================================
--- branches/trunk-reorg/bknr/projects/scrabble/src/package.lisp	2007-10-04 21:08:36 UTC (rev 2210)
+++ branches/trunk-reorg/bknr/projects/scrabble/src/package.lisp	2007-10-04 21:34:36 UTC (rev 2211)
@@ -0,0 +1,11 @@
+
+(defpackage :scrabble
+  (:use :cl :alexandria :anaphora)
+  (:export "*BOARD-SCORING*"
+           "*TILE-SETS*"
+           "FIELD-TYPE"))
+
+(defpackage :scrabble.graphics
+  (:use :cl :alexandria :vecto :scrabble)
+  (:shadowing-import-from :vecto "ROTATE"))
+  
\ No newline at end of file

Added: branches/trunk-reorg/bknr/projects/scrabble/src/scrabble-test.lisp
===================================================================
--- branches/trunk-reorg/bknr/projects/scrabble/src/scrabble-test.lisp	2007-10-04 21:08:36 UTC (rev 2210)
+++ branches/trunk-reorg/bknr/projects/scrabble/src/scrabble-test.lisp	2007-10-04 21:34:36 UTC (rev 2211)
@@ -0,0 +1,23 @@
+
+(defun test-adjacent ()
+  (let ((board (make-array '(15 15) :initial-element nil)))
+    (check-adjacent board 7 7)
+    (handler-case
+        (check-adjacent board 0 0)
+      (not-touching-other-tile (e)
+        (declare (ignore e))))
+    (setf (aref board 7 7) t)
+    (handler-case
+        (check-adjacent board 7 7)
+      (tile-placed-on-occupied-field (e)
+        (declare (ignore e))))
+    (check-adjacent board 6 7)
+    (check-adjacent board 7 6)
+    (check-adjacent board 8 7)
+    (check-adjacent board 7 8)
+    (setf (aref board 0 0) t)
+    (check-adjacent board 0 1)
+    (check-adjacent board 1 0)
+    (setf (aref board 14 14) t)
+    (check-adjacent board 14 13)
+    (check-adjacent board 13 14)))

Added: branches/trunk-reorg/bknr/projects/scrabble/src/scrabble.asd
===================================================================
--- branches/trunk-reorg/bknr/projects/scrabble/src/scrabble.asd	2007-10-04 21:08:36 UTC (rev 2210)
+++ branches/trunk-reorg/bknr/projects/scrabble/src/scrabble.asd	2007-10-04 21:34:36 UTC (rev 2211)
@@ -0,0 +1,18 @@
+;;;; -*- lisp -*-
+
+(in-package :cl-user)
+
+(defpackage :scrabble.system
+  (:use :cl :asdf))
+
+(in-package :scrabble.system)
+
+(defsystem :scrabble
+    :name "Scrabble"
+    :licence "BSD"
+    :depends-on (:bknr-datastore :vecto :alexandria :anaphora)
+    :serial t
+    :components ((:file "package")
+                 (:file "scrabble")
+                 (:file "make-html")
+                 (:file "make-letters")))

Added: branches/trunk-reorg/bknr/projects/scrabble/src/scrabble.lisp
===================================================================
--- branches/trunk-reorg/bknr/projects/scrabble/src/scrabble.lisp	2007-10-04 21:08:36 UTC (rev 2210)
+++ branches/trunk-reorg/bknr/projects/scrabble/src/scrabble.lisp	2007-10-04 21:34:36 UTC (rev 2211)
@@ -0,0 +1,293 @@
+(in-package :scrabble)
+
+(defparameter *board-scoring*
+  #2A((:triple-word nil nil :double-letter nil nil nil :triple-word nil nil nil :double-letter nil nil :triple-word)
+      (nil :double-word nil nil nil :triple-letter nil nil nil :triple-letter nil nil nil :double-word nil)
+      (nil nil :double-word nil nil nil :double-letter nil :double-letter nil nil nil :double-word nil nil)
+      (:double-letter nil nil :double-word nil nil nil :double-letter nil nil nil :double-word nil nil :double-letter)
+      (nil nil nil nil :double-word nil nil nil nil nil :double-word nil nil nil nil)
+      (nil :triple-letter nil nil nil :triple-letter nil nil nil :triple-letter nil nil nil :triple-letter nil)
+      (nil nil :double-letter nil nil nil :double-letter nil :double-letter nil nil nil :double-letter nil nil)
+      (:triple-word nil nil :double-letter nil nil nil :triple-word nil nil nil :double-letter nil nil :triple-word)
+      (nil nil :double-letter nil nil nil :double-letter nil :double-letter nil nil nil :double-letter nil nil)
+      (nil :triple-letter nil nil nil :triple-letter nil nil nil :triple-letter nil nil nil :triple-letter nil)
+      (nil nil nil nil :double-word nil nil nil nil nil :double-word nil nil nil nil)
+      (:double-letter nil nil :double-word nil nil nil :double-letter nil nil nil :double-word nil nil :double-letter)
+      (nil nil :double-word nil nil nil :double-letter nil :double-letter nil nil nil :double-word nil nil)
+      (nil :double-word nil nil nil :triple-letter nil nil nil :triple-letter nil nil nil :double-word nil)
+      (:triple-word nil nil :double-letter nil nil nil :triple-word nil nil nil :double-letter nil nil :triple-word)))
+
+(defun field-type (x y)
+  (or (aref *board-scoring* x y)
+      :standard))
+
+(defparameter *tile-sets* (make-hash-table))
+
+(setf (gethash :de *tile-sets*)
+      '((#\A 1 5)
+        (#\B 3 2)
+        (#\C 4 2)
+        (#\D 1 4)
+        (#\E 1 15)
+        (#\F 4 2)
+        (#\G 2 3)
+        (#\H 2 4)
+        (#\I 1 6)
+        (#\J 6 1)
+        (#\K 4 2)
+        (#\L 2 3)
+        (#\M 3 4)
+        (#\N 1 9)
+        (#\O 2 3)
+        (#\P 4 1)
+        (#\Q 10 1)
+        (#\R 1 6)
+        (#\S 1 7)
+        (#\T 1 6)
+        (#\U 1 6)
+        (#\V 6 1)
+        (#\W 3 1)
+        (#\X 8 1)
+        (#\Y 10 1)
+        (#\Z 3 1)
+        #-cmu (#\LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS 6 1)
+        #-cmu (#\LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS 8 1)
+        #-cmu (#\LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS 6 1)
+        (nil 0 2)))
+
+(define-condition invalid-move (simple-error)
+  ()
+  (:report (lambda (c stream)
+             (format stream "Invalid move: ~A" (type-of c)))))
+
+(defun seq (from to)
+  (loop for i from from upto to
+        collect i))
+
+(defun positions-between (start-position end-position)
+  (if (= (first start-position)
+         (first end-position))
+      (mapcar (lambda (y) (list (first start-position) y))
+              (seq (second start-position) (second end-position)))
+      (mapcar (lambda (x) (list x (second start-position)))
+              (seq (first start-position) (first end-position)))))
+
+(defclass tile-placement ()
+  ((x :reader x-of :initarg :x)
+   (y :reader y-of :initarg :y)
+   (tile :reader tile-of :initarg :tile))
+  (:documentation "Represents placement of a letter tile on the board"))
+
+(defun make-tile-placement (x y tile)
+  (make-instance 'tile-placement :x x :y y :tile tile))
+
+(defun make-tile-placements (list-of-moves)
+  (mapcar (curry #'apply 'make-tile-placement) list-of-moves))
+
+(defmethod equal-position ((tile-placement-1 tile-placement) (tile-placement-2 tile-placement))
+  (and (= (x-of tile-placement-1) (x-of tile-placement-2))
+       (= (y-of tile-placement-1) (y-of tile-placement-2))))
+
+(defmethod position-equal ((position list) (tile-placement tile-placement))
+  "Return non-nil if the given POSITION is at the position of PLACED-TILE"
+  (and (= (first position) (x-of tile-placement))
+       (= (second position) (y-of tile-placement))))
+
+(defmethod position-< ((a tile-placement) (b tile-placement))
+  "Compare positions of placements, for sorting"
+  (or (< (x-of a) (x-of b))
+      (< (y-of a) (y-of b))))
+
+(defclass board ()
+  ((placed-tiles :accessor placed-tiles-of :initform (make-array '(15 15) :initial-element nil))))
+
+(defmethod print-object ((board board) stream)
+  (print-unreadable-object (board stream :type t :identity t)
+    (terpri stream)
+    (dotimes (x 15)
+      (dotimes (y 15)
+        (format stream "~C " (aif (at-xy board x y) (char-of it) #\.)))
+      (terpri stream))))
+
+(defmethod at-xy ((board board) x y)
+  (aref (placed-tiles-of board) x y))
+
+(defmethod at-placement ((board board) tile-placement)
+  (at-xy board (x-of tile-placement) (y-of tile-placement)))
+
+(defmethod put-letter ((board board) tile x y)
+  (setf (aref (placed-tiles-of board) x y) tile))
+
+(defclass tile ()
+  ((char :reader char-of :initarg :char)
+   (value :reader value-of :initarg :value)))
+
+(defmethod print-object ((tile tile) stream)
+  (print-unreadable-object (tile stream :type t :identity nil)
+    (with-slots (char value) tile
+      (format stream "~A (~A)" char value))))
+
+(defun make-tile (char value)
+  (make-instance 'tile :char char :value value))
+
+(defclass tile-bag ()
+  ((tiles :initarg :tiles :accessor tiles-of)))
+
+(defmethod remaining-tile-count ((tile-bag tile-bag))
+  (fill-pointer (tiles-of tile-bag)))
+
+(defmethod print-object ((tile-bag tile-bag) stream)
+  (print-unreadable-object (tile-bag stream :type t :identity t)
+    (format stream "~A letters remaining" (remaining-tile-count tile-bag))))
+
+(defun make-tile-bag (language)
+  (let ((tiles (make-array 102 :adjustable t :fill-pointer 0)))
+    (mapcar (lambda (entry)
+              (destructuring-bind (char value count) entry
+                (dotimes (i count)
+                  (vector-push-extend (make-tile char value) tiles))))
+            (or (gethash language *tile-sets*)
+                 (error "language ~A not defined" language)))
+    (dotimes (i (fill-pointer tiles))
+      (let ((tmp (aref tiles i))
+            (random-index (random (fill-pointer tiles))))
+        (setf (aref tiles i) (aref tiles random-index))
+        (setf (aref tiles random-index) tmp)))
+    (make-instance 'tile-bag :tiles tiles)))
+
+(define-condition no-tiles-remaining (simple-error)
+  ())
+
+(defmethod draw-tile ((tile-bag tile-bag))
+  (unless (plusp (remaining-tile-count tile-bag))
+    (error 'no-tiles-remaining))
+  (with-slots (tiles) tile-bag
+    (prog1
+        (aref tiles (1- (fill-pointer tiles)))
+      (decf (fill-pointer tiles)))))
+
+(defmethod placed-tile-adjacent ((board board) (tile-placement tile-placement))
+  "Check whether the given TILE-PLACEMENT on the board is adjacent to
+another tile or if it is the start position."
+  (with-accessors ((x x-of) (y y-of))
+    tile-placement
+    (or (and (eql x 7)
+             (eql y 7))
+        (and (plusp x)
+             (at-xy board (1- x) y))
+        (and (plusp y)
+             (at-xy board x (1- y)))
+        (and (< x 14)
+             (at-xy board (1+ x) y))
+        (and (< y 14)
+             (at-xy board x (1+ y))))))
+
+(defun placed-or-being-placed (board placed-tiles position)
+  (or (at-xy board (first position) (second position))
+      (awhen (find position placed-tiles :test #'position-equal)
+        (values (tile-of it) t))))
+
+(define-condition not-touching-other-tile (invalid-move) ())
+(define-condition not-in-a-row (invalid-move) ())
+(define-condition placed-on-occupied-field (invalid-move) ())
+(define-condition no-tile-placed (invalid-move) ())
+(define-condition multiple-letters-placed-on-one-field (invalid-move) ())
+(define-condition placement-with-holes (invalid-move) ())
+
+(defun check-move-legality (board placed-tiles)
+  "Verify that placing the PLACED-TILES on BOARD is a legal Scrabble
+move.  If the move is not valid, a specific INVALID-MOVE condition is
+signalled.  Otherwise, t is returned."
+  (unless placed-tiles
+    (error 'no-tile-placed))
+
+  (unless (or (apply #'= (mapcar #'x-of placed-tiles))
+              (apply #'= (mapcar #'y-of placed-tiles)))
+    (error 'not-in-a-row))
+
+  (when (some (curry #'at-placement board) placed-tiles)
+    (error 'tile-placed-on-occupied-field))
+
+  (unless (equal placed-tiles
+                 (remove-duplicates placed-tiles :test #'equal-position))
+    (error 'multiple-letters-placed-on-one-field))
+
+  (let* ((placed-tiles (sort (copy-list placed-tiles) #'position-<))
+         (start-of-placement (first placed-tiles))
+         (end-of-placement (first (last placed-tiles))))
+    (unless (every (curry 'placed-or-being-placed board placed-tiles)
+                   (positions-between (list (x-of start-of-placement) (y-of start-of-placement))
+                                      (list (x-of end-of-placement) (y-of end-of-placement))))
+      (error 'placement-with-holes)))
+
+  (unless (or (find '(7 7) placed-tiles :test #'position-equal)
+              (some (curry #'placed-tile-adjacent board) placed-tiles))
+    (error 'not-touching-other-tile))
+  
+  t)
+
+(defun words-formed% (board placed-tiles verticalp)
+  "Scan for words that would be formed by placing PLACED-TILES on
+BOARD.  VERTICALP determines the scan order, if nil, the board is
+scanned horizontally, else vertically.  This is called by WORDS-FORMED
+below, see there for a description of the return value format."
+  (let (words)
+    (dotimes (x 15)
+      (when (find x placed-tiles :key (if verticalp #'y-of #'x-of) :test #'=)
+        (let (word is-new-word)
+          (dotimes (y 15)
+            (multiple-value-bind (placed-tile being-placed) (placed-or-being-placed board placed-tiles (if verticalp (list y x) (list x y)))
+              (when (and word (null placed-tile))
+                (when (and (cdr word) is-new-word)
+                  (push (nreverse word) words))
+                (setf word nil is-new-word nil))
+              (when placed-tile
+                (push (list placed-tile (and being-placed (field-type x y))) word)
+                (when being-placed
+                  (setf is-new-word t)))))
+          (when (and (cdr word) is-new-word)
+            (push (nreverse word) words)))))
+    (nreverse words)))
+
+(defun words-formed (board placed-tiles)
+  "Return list of all words formed by placing the tiles in
+PLACED-TILES on the BOARD.  Returns each word as a list, with each
+letter of the word represented by a list (TILE FIELD-TYPE).  TILE is
+the tile for the letter, FIELD-TYPE is either the field type of the
+field that the letter has been placed on, or NIL if the tile was
+already on the board."
+  (append (words-formed% board placed-tiles nil)
+          (words-formed% board placed-tiles t)))
+
+(defun word-score (word-result)
+  "Process one word result from WORDS-FORMED and calculate the score
+for the word."
+  (let ((factor 1)
+        (value 0))
+    (dolist (entry word-result)
+      (destructuring-bind (tile field-type) entry
+        (incf value (value-of tile))
+        (case field-type
+          ((:double-letter) (incf value (value-of tile)))
+          ((:triple-letter) (incf value (* 2 (value-of tile))))
+          ((:double-word) (setf factor (* factor 2)))
+          ((:triple-word) (setf factor (* factor 3))))))
+    (* value factor)))
+
+(defun word-text (word-result)
+  "Convert the letter in a word result returned by WORDS-FORMED to a
+string."
+  (coerce (mapcar (compose #'char-of #'car) word-result) 'string))
+
+(defun make-move (board placed-tiles)
+  "Actually perform a move.  BOARD contains the already placed tiles,
+PLACED-TILES contains the letters for the move to make.  BOARD is
+modified to include the tiles placed. Returns the two values that
+CALCULATE-SCORE returns for the move."
+  (check-move-legality board placed-tiles)
+  (prog1
+      (mapcar (lambda (word-result)
+                (list (word-text word-result) (word-score word-result)))
+              (words-formed board placed-tiles))
+    (dolist (placed-tile placed-tiles)
+      (put-letter board (tile-of placed-tile) (x-of placed-tile) (y-of placed-tile)))))

Added: branches/trunk-reorg/bknr/projects/scrabble/src/setup-registry.lisp
===================================================================
--- branches/trunk-reorg/bknr/projects/scrabble/src/setup-registry.lisp	2007-10-04 21:08:36 UTC (rev 2210)
+++ branches/trunk-reorg/bknr/projects/scrabble/src/setup-registry.lisp	2007-10-04 21:34:36 UTC (rev 2211)
@@ -0,0 +1,14 @@
+(in-package :cl-user)
+
+(defun setup-registry (directory-path)
+  (format t "; adding components under ~A to asdf registry~%" directory-path)
+  (mapc #'(lambda (asd-pathname)
+	    (pushnew (make-pathname :name nil
+				    :type nil
+				    :version nil 
+				    :defaults asd-pathname)
+		     asdf:*central-registry*
+		     :test #'equal))
+	(directory (merge-pathnames #p"**/*.asd" directory-path))))
+
+(setup-registry (merge-pathnames #p"../thirdparty/" *load-truename*))
\ No newline at end of file

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/A.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/A.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/B.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/B.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/C.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/C.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/D.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/D.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/E.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/E.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/F.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/F.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/G.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/G.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/H.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/H.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/I.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/I.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/J.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/J.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/K.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/K.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/L.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/L.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/M.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/M.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/N.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/N.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/NIL.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/NIL.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/O.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/O.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/P.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/P.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/Q.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/Q.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/R.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/R.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/S.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/S.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/T.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/T.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/U.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/U.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/V.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/V.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/W.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/W.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/X.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/X.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/Y.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/Y.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/Z.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/Z.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/double-letter.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/double-letter.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/double-word.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/double-word.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/scrabble.css
===================================================================
--- branches/trunk-reorg/bknr/projects/scrabble/website/de/scrabble.css	2007-10-04 21:08:36 UTC (rev 2210)
+++ branches/trunk-reorg/bknr/projects/scrabble/website/de/scrabble.css	2007-10-04 21:34:36 UTC (rev 2211)
@@ -0,0 +1,228 @@
+#playfield { position: absolute }
+#playfield div { position: absolute; width: 40px; height: 40px }
+#playfield img { position: absolute; top: 3px; left: 3px }
+#playfield #field-0-0 { background-image: url(triple-word.png); left: 0; top: 0 }
+#playfield #field-0-1 { background-image: url(standard.png); left: 0; top: 44 }
+#playfield #field-0-2 { background-image: url(standard.png); left: 0; top: 88 }
+#playfield #field-0-3 { background-image: url(double-letter.png); left: 0; top: 132 }
+#playfield #field-0-4 { background-image: url(standard.png); left: 0; top: 176 }
+#playfield #field-0-5 { background-image: url(standard.png); left: 0; top: 220 }
+#playfield #field-0-6 { background-image: url(standard.png); left: 0; top: 264 }
+#playfield #field-0-7 { background-image: url(triple-word.png); left: 0; top: 308 }
+#playfield #field-0-8 { background-image: url(standard.png); left: 0; top: 352 }
+#playfield #field-0-9 { background-image: url(standard.png); left: 0; top: 396 }
+#playfield #field-0-10 { background-image: url(standard.png); left: 0; top: 440 }
+#playfield #field-0-11 { background-image: url(double-letter.png); left: 0; top: 484 }
+#playfield #field-0-12 { background-image: url(standard.png); left: 0; top: 528 }
+#playfield #field-0-13 { background-image: url(standard.png); left: 0; top: 572 }
+#playfield #field-0-14 { background-image: url(triple-word.png); left: 0; top: 616 }
+#playfield #field-1-0 { background-image: url(standard.png); left: 44; top: 0 }
+#playfield #field-1-1 { background-image: url(double-word.png); left: 44; top: 44 }
+#playfield #field-1-2 { background-image: url(standard.png); left: 44; top: 88 }
+#playfield #field-1-3 { background-image: url(standard.png); left: 44; top: 132 }
+#playfield #field-1-4 { background-image: url(standard.png); left: 44; top: 176 }
+#playfield #field-1-5 { background-image: url(triple-letter.png); left: 44; top: 220 }
+#playfield #field-1-6 { background-image: url(standard.png); left: 44; top: 264 }
+#playfield #field-1-7 { background-image: url(standard.png); left: 44; top: 308 }
+#playfield #field-1-8 { background-image: url(standard.png); left: 44; top: 352 }
+#playfield #field-1-9 { background-image: url(triple-letter.png); left: 44; top: 396 }
+#playfield #field-1-10 { background-image: url(standard.png); left: 44; top: 440 }
+#playfield #field-1-11 { background-image: url(standard.png); left: 44; top: 484 }
+#playfield #field-1-12 { background-image: url(standard.png); left: 44; top: 528 }
+#playfield #field-1-13 { background-image: url(double-word.png); left: 44; top: 572 }
+#playfield #field-1-14 { background-image: url(standard.png); left: 44; top: 616 }
+#playfield #field-2-0 { background-image: url(standard.png); left: 88; top: 0 }
+#playfield #field-2-1 { background-image: url(standard.png); left: 88; top: 44 }
+#playfield #field-2-2 { background-image: url(double-word.png); left: 88; top: 88 }
+#playfield #field-2-3 { background-image: url(standard.png); left: 88; top: 132 }
+#playfield #field-2-4 { background-image: url(standard.png); left: 88; top: 176 }
+#playfield #field-2-5 { background-image: url(standard.png); left: 88; top: 220 }
+#playfield #field-2-6 { background-image: url(double-letter.png); left: 88; top: 264 }
+#playfield #field-2-7 { background-image: url(standard.png); left: 88; top: 308 }
+#playfield #field-2-8 { background-image: url(double-letter.png); left: 88; top: 352 }
+#playfield #field-2-9 { background-image: url(standard.png); left: 88; top: 396 }
+#playfield #field-2-10 { background-image: url(standard.png); left: 88; top: 440 }
+#playfield #field-2-11 { background-image: url(standard.png); left: 88; top: 484 }
+#playfield #field-2-12 { background-image: url(double-word.png); left: 88; top: 528 }
+#playfield #field-2-13 { background-image: url(standard.png); left: 88; top: 572 }
+#playfield #field-2-14 { background-image: url(standard.png); left: 88; top: 616 }
+#playfield #field-3-0 { background-image: url(double-letter.png); left: 132; top: 0 }
+#playfield #field-3-1 { background-image: url(standard.png); left: 132; top: 44 }
+#playfield #field-3-2 { background-image: url(standard.png); left: 132; top: 88 }
+#playfield #field-3-3 { background-image: url(double-word.png); left: 132; top: 132 }
+#playfield #field-3-4 { background-image: url(standard.png); left: 132; top: 176 }
+#playfield #field-3-5 { background-image: url(standard.png); left: 132; top: 220 }
+#playfield #field-3-6 { background-image: url(standard.png); left: 132; top: 264 }
+#playfield #field-3-7 { background-image: url(double-letter.png); left: 132; top: 308 }
+#playfield #field-3-8 { background-image: url(standard.png); left: 132; top: 352 }
+#playfield #field-3-9 { background-image: url(standard.png); left: 132; top: 396 }
+#playfield #field-3-10 { background-image: url(standard.png); left: 132; top: 440 }
+#playfield #field-3-11 { background-image: url(double-word.png); left: 132; top: 484 }
+#playfield #field-3-12 { background-image: url(standard.png); left: 132; top: 528 }
+#playfield #field-3-13 { background-image: url(standard.png); left: 132; top: 572 }
+#playfield #field-3-14 { background-image: url(double-letter.png); left: 132; top: 616 }
+#playfield #field-4-0 { background-image: url(standard.png); left: 176; top: 0 }
+#playfield #field-4-1 { background-image: url(standard.png); left: 176; top: 44 }
+#playfield #field-4-2 { background-image: url(standard.png); left: 176; top: 88 }
+#playfield #field-4-3 { background-image: url(standard.png); left: 176; top: 132 }
+#playfield #field-4-4 { background-image: url(double-word.png); left: 176; top: 176 }
+#playfield #field-4-5 { background-image: url(standard.png); left: 176; top: 220 }
+#playfield #field-4-6 { background-image: url(standard.png); left: 176; top: 264 }
+#playfield #field-4-7 { background-image: url(standard.png); left: 176; top: 308 }
+#playfield #field-4-8 { background-image: url(standard.png); left: 176; top: 352 }
+#playfield #field-4-9 { background-image: url(standard.png); left: 176; top: 396 }
+#playfield #field-4-10 { background-image: url(double-word.png); left: 176; top: 440 }
+#playfield #field-4-11 { background-image: url(standard.png); left: 176; top: 484 }
+#playfield #field-4-12 { background-image: url(standard.png); left: 176; top: 528 }
+#playfield #field-4-13 { background-image: url(standard.png); left: 176; top: 572 }
+#playfield #field-4-14 { background-image: url(standard.png); left: 176; top: 616 }
+#playfield #field-5-0 { background-image: url(standard.png); left: 220; top: 0 }
+#playfield #field-5-1 { background-image: url(triple-letter.png); left: 220; top: 44 }
+#playfield #field-5-2 { background-image: url(standard.png); left: 220; top: 88 }
+#playfield #field-5-3 { background-image: url(standard.png); left: 220; top: 132 }
+#playfield #field-5-4 { background-image: url(standard.png); left: 220; top: 176 }
+#playfield #field-5-5 { background-image: url(triple-letter.png); left: 220; top: 220 }
+#playfield #field-5-6 { background-image: url(standard.png); left: 220; top: 264 }
+#playfield #field-5-7 { background-image: url(standard.png); left: 220; top: 308 }
+#playfield #field-5-8 { background-image: url(standard.png); left: 220; top: 352 }
+#playfield #field-5-9 { background-image: url(triple-letter.png); left: 220; top: 396 }
+#playfield #field-5-10 { background-image: url(standard.png); left: 220; top: 440 }
+#playfield #field-5-11 { background-image: url(standard.png); left: 220; top: 484 }
+#playfield #field-5-12 { background-image: url(standard.png); left: 220; top: 528 }
+#playfield #field-5-13 { background-image: url(triple-letter.png); left: 220; top: 572 }
+#playfield #field-5-14 { background-image: url(standard.png); left: 220; top: 616 }
+#playfield #field-6-0 { background-image: url(standard.png); left: 264; top: 0 }
+#playfield #field-6-1 { background-image: url(standard.png); left: 264; top: 44 }
+#playfield #field-6-2 { background-image: url(double-letter.png); left: 264; top: 88 }
+#playfield #field-6-3 { background-image: url(standard.png); left: 264; top: 132 }
+#playfield #field-6-4 { background-image: url(standard.png); left: 264; top: 176 }
+#playfield #field-6-5 { background-image: url(standard.png); left: 264; top: 220 }
+#playfield #field-6-6 { background-image: url(double-letter.png); left: 264; top: 264 }
+#playfield #field-6-7 { background-image: url(standard.png); left: 264; top: 308 }
+#playfield #field-6-8 { background-image: url(double-letter.png); left: 264; top: 352 }
+#playfield #field-6-9 { background-image: url(standard.png); left: 264; top: 396 }
+#playfield #field-6-10 { background-image: url(standard.png); left: 264; top: 440 }
+#playfield #field-6-11 { background-image: url(standard.png); left: 264; top: 484 }
+#playfield #field-6-12 { background-image: url(double-letter.png); left: 264; top: 528 }
+#playfield #field-6-13 { background-image: url(standard.png); left: 264; top: 572 }
+#playfield #field-6-14 { background-image: url(standard.png); left: 264; top: 616 }
+#playfield #field-7-0 { background-image: url(triple-word.png); left: 308; top: 0 }
+#playfield #field-7-1 { background-image: url(standard.png); left: 308; top: 44 }
+#playfield #field-7-2 { background-image: url(standard.png); left: 308; top: 88 }
+#playfield #field-7-3 { background-image: url(double-letter.png); left: 308; top: 132 }
+#playfield #field-7-4 { background-image: url(standard.png); left: 308; top: 176 }
+#playfield #field-7-5 { background-image: url(standard.png); left: 308; top: 220 }
+#playfield #field-7-6 { background-image: url(standard.png); left: 308; top: 264 }
+#playfield #field-7-7 { background-image: url(triple-word.png); left: 308; top: 308 }
+#playfield #field-7-8 { background-image: url(standard.png); left: 308; top: 352 }
+#playfield #field-7-9 { background-image: url(standard.png); left: 308; top: 396 }
+#playfield #field-7-10 { background-image: url(standard.png); left: 308; top: 440 }
+#playfield #field-7-11 { background-image: url(double-letter.png); left: 308; top: 484 }
+#playfield #field-7-12 { background-image: url(standard.png); left: 308; top: 528 }
+#playfield #field-7-13 { background-image: url(standard.png); left: 308; top: 572 }
+#playfield #field-7-14 { background-image: url(triple-word.png); left: 308; top: 616 }
+#playfield #field-8-0 { background-image: url(standard.png); left: 352; top: 0 }
+#playfield #field-8-1 { background-image: url(standard.png); left: 352; top: 44 }
+#playfield #field-8-2 { background-image: url(double-letter.png); left: 352; top: 88 }
+#playfield #field-8-3 { background-image: url(standard.png); left: 352; top: 132 }
+#playfield #field-8-4 { background-image: url(standard.png); left: 352; top: 176 }
+#playfield #field-8-5 { background-image: url(standard.png); left: 352; top: 220 }
+#playfield #field-8-6 { background-image: url(double-letter.png); left: 352; top: 264 }
+#playfield #field-8-7 { background-image: url(standard.png); left: 352; top: 308 }
+#playfield #field-8-8 { background-image: url(double-letter.png); left: 352; top: 352 }
+#playfield #field-8-9 { background-image: url(standard.png); left: 352; top: 396 }
+#playfield #field-8-10 { background-image: url(standard.png); left: 352; top: 440 }
+#playfield #field-8-11 { background-image: url(standard.png); left: 352; top: 484 }
+#playfield #field-8-12 { background-image: url(double-letter.png); left: 352; top: 528 }
+#playfield #field-8-13 { background-image: url(standard.png); left: 352; top: 572 }
+#playfield #field-8-14 { background-image: url(standard.png); left: 352; top: 616 }
+#playfield #field-9-0 { background-image: url(standard.png); left: 396; top: 0 }
+#playfield #field-9-1 { background-image: url(triple-letter.png); left: 396; top: 44 }
+#playfield #field-9-2 { background-image: url(standard.png); left: 396; top: 88 }
+#playfield #field-9-3 { background-image: url(standard.png); left: 396; top: 132 }
+#playfield #field-9-4 { background-image: url(standard.png); left: 396; top: 176 }
+#playfield #field-9-5 { background-image: url(triple-letter.png); left: 396; top: 220 }
+#playfield #field-9-6 { background-image: url(standard.png); left: 396; top: 264 }
+#playfield #field-9-7 { background-image: url(standard.png); left: 396; top: 308 }
+#playfield #field-9-8 { background-image: url(standard.png); left: 396; top: 352 }
+#playfield #field-9-9 { background-image: url(triple-letter.png); left: 396; top: 396 }
+#playfield #field-9-10 { background-image: url(standard.png); left: 396; top: 440 }
+#playfield #field-9-11 { background-image: url(standard.png); left: 396; top: 484 }
+#playfield #field-9-12 { background-image: url(standard.png); left: 396; top: 528 }
+#playfield #field-9-13 { background-image: url(triple-letter.png); left: 396; top: 572 }
+#playfield #field-9-14 { background-image: url(standard.png); left: 396; top: 616 }
+#playfield #field-10-0 { background-image: url(standard.png); left: 440; top: 0 }
+#playfield #field-10-1 { background-image: url(standard.png); left: 440; top: 44 }
+#playfield #field-10-2 { background-image: url(standard.png); left: 440; top: 88 }
+#playfield #field-10-3 { background-image: url(standard.png); left: 440; top: 132 }
+#playfield #field-10-4 { background-image: url(double-word.png); left: 440; top: 176 }
+#playfield #field-10-5 { background-image: url(standard.png); left: 440; top: 220 }
+#playfield #field-10-6 { background-image: url(standard.png); left: 440; top: 264 }
+#playfield #field-10-7 { background-image: url(standard.png); left: 440; top: 308 }
+#playfield #field-10-8 { background-image: url(standard.png); left: 440; top: 352 }
+#playfield #field-10-9 { background-image: url(standard.png); left: 440; top: 396 }
+#playfield #field-10-10 { background-image: url(double-word.png); left: 440; top: 440 }
+#playfield #field-10-11 { background-image: url(standard.png); left: 440; top: 484 }
+#playfield #field-10-12 { background-image: url(standard.png); left: 440; top: 528 }
+#playfield #field-10-13 { background-image: url(standard.png); left: 440; top: 572 }
+#playfield #field-10-14 { background-image: url(standard.png); left: 440; top: 616 }
+#playfield #field-11-0 { background-image: url(double-letter.png); left: 484; top: 0 }
+#playfield #field-11-1 { background-image: url(standard.png); left: 484; top: 44 }
+#playfield #field-11-2 { background-image: url(standard.png); left: 484; top: 88 }
+#playfield #field-11-3 { background-image: url(double-word.png); left: 484; top: 132 }
+#playfield #field-11-4 { background-image: url(standard.png); left: 484; top: 176 }
+#playfield #field-11-5 { background-image: url(standard.png); left: 484; top: 220 }
+#playfield #field-11-6 { background-image: url(standard.png); left: 484; top: 264 }
+#playfield #field-11-7 { background-image: url(double-letter.png); left: 484; top: 308 }
+#playfield #field-11-8 { background-image: url(standard.png); left: 484; top: 352 }
+#playfield #field-11-9 { background-image: url(standard.png); left: 484; top: 396 }
+#playfield #field-11-10 { background-image: url(standard.png); left: 484; top: 440 }
+#playfield #field-11-11 { background-image: url(double-word.png); left: 484; top: 484 }
+#playfield #field-11-12 { background-image: url(standard.png); left: 484; top: 528 }
+#playfield #field-11-13 { background-image: url(standard.png); left: 484; top: 572 }
+#playfield #field-11-14 { background-image: url(double-letter.png); left: 484; top: 616 }
+#playfield #field-12-0 { background-image: url(standard.png); left: 528; top: 0 }
+#playfield #field-12-1 { background-image: url(standard.png); left: 528; top: 44 }
+#playfield #field-12-2 { background-image: url(double-word.png); left: 528; top: 88 }
+#playfield #field-12-3 { background-image: url(standard.png); left: 528; top: 132 }
+#playfield #field-12-4 { background-image: url(standard.png); left: 528; top: 176 }
+#playfield #field-12-5 { background-image: url(standard.png); left: 528; top: 220 }
+#playfield #field-12-6 { background-image: url(double-letter.png); left: 528; top: 264 }
+#playfield #field-12-7 { background-image: url(standard.png); left: 528; top: 308 }
+#playfield #field-12-8 { background-image: url(double-letter.png); left: 528; top: 352 }
+#playfield #field-12-9 { background-image: url(standard.png); left: 528; top: 396 }
+#playfield #field-12-10 { background-image: url(standard.png); left: 528; top: 440 }
+#playfield #field-12-11 { background-image: url(standard.png); left: 528; top: 484 }
+#playfield #field-12-12 { background-image: url(double-word.png); left: 528; top: 528 }
+#playfield #field-12-13 { background-image: url(standard.png); left: 528; top: 572 }
+#playfield #field-12-14 { background-image: url(standard.png); left: 528; top: 616 }
+#playfield #field-13-0 { background-image: url(standard.png); left: 572; top: 0 }
+#playfield #field-13-1 { background-image: url(double-word.png); left: 572; top: 44 }
+#playfield #field-13-2 { background-image: url(standard.png); left: 572; top: 88 }
+#playfield #field-13-3 { background-image: url(standard.png); left: 572; top: 132 }
+#playfield #field-13-4 { background-image: url(standard.png); left: 572; top: 176 }
+#playfield #field-13-5 { background-image: url(triple-letter.png); left: 572; top: 220 }
+#playfield #field-13-6 { background-image: url(standard.png); left: 572; top: 264 }
+#playfield #field-13-7 { background-image: url(standard.png); left: 572; top: 308 }
+#playfield #field-13-8 { background-image: url(standard.png); left: 572; top: 352 }
+#playfield #field-13-9 { background-image: url(triple-letter.png); left: 572; top: 396 }
+#playfield #field-13-10 { background-image: url(standard.png); left: 572; top: 440 }
+#playfield #field-13-11 { background-image: url(standard.png); left: 572; top: 484 }
+#playfield #field-13-12 { background-image: url(standard.png); left: 572; top: 528 }
+#playfield #field-13-13 { background-image: url(double-word.png); left: 572; top: 572 }
+#playfield #field-13-14 { background-image: url(standard.png); left: 572; top: 616 }
+#playfield #field-14-0 { background-image: url(triple-word.png); left: 616; top: 0 }
+#playfield #field-14-1 { background-image: url(standard.png); left: 616; top: 44 }
+#playfield #field-14-2 { background-image: url(standard.png); left: 616; top: 88 }
+#playfield #field-14-3 { background-image: url(double-letter.png); left: 616; top: 132 }
+#playfield #field-14-4 { background-image: url(standard.png); left: 616; top: 176 }
+#playfield #field-14-5 { background-image: url(standard.png); left: 616; top: 220 }
+#playfield #field-14-6 { background-image: url(standard.png); left: 616; top: 264 }
+#playfield #field-14-7 { background-image: url(triple-word.png); left: 616; top: 308 }
+#playfield #field-14-8 { background-image: url(standard.png); left: 616; top: 352 }
+#playfield #field-14-9 { background-image: url(standard.png); left: 616; top: 396 }
+#playfield #field-14-10 { background-image: url(standard.png); left: 616; top: 440 }
+#playfield #field-14-11 { background-image: url(double-letter.png); left: 616; top: 484 }
+#playfield #field-14-12 { background-image: url(standard.png); left: 616; top: 528 }
+#playfield #field-14-13 { background-image: url(standard.png); left: 616; top: 572 }
+#playfield #field-14-14 { background-image: url(triple-word.png); left: 616; top: 616 }

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/standard.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/standard.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/test.html
===================================================================
--- branches/trunk-reorg/bknr/projects/scrabble/website/de/test.html	2007-10-04 21:08:36 UTC (rev 2210)
+++ branches/trunk-reorg/bknr/projects/scrabble/website/de/test.html	2007-10-04 21:34:36 UTC (rev 2211)
@@ -0,0 +1,268 @@
+<head>
+ <link rel="stylesheet" type="text/css" href="scrabble.css" />
+</head>
+<body bgcolor="#004B36">
+<img src="A.png"/>
+<img src="B.png"/>
+<img src="C.png"/>
+<img src="D.png"/>
+<img src="E.png"/>
+<img src="F.png"/>
+<img src="G.png"/>
+<img src="H.png"/>
+<img src="I.png"/>
+<img src="J.png"/>
+<img src="K.png"/>
+<img src="L.png"/>
+<img src="M.png"/>
+<img src="N.png"/>
+<img src="O.png"/>
+<img src="P.png"/>
+<img src="Q.png"/>
+<img src="R.png"/>
+<img src="S.png"/>
+<img src="T.png"/>
+<img src="U.png"/>
+<img src="V.png"/>
+<img src="W.png"/>
+<img src="X.png"/>
+<img src="Y.png"/>
+<img src="Z.png"/>
+<img src="Ä.png"/>
+<img src="Ö.png"/>
+<img src="Ü.png"/>
+<br>
+<img src="double-letter.png"/>
+<img src="double-word.png"/>
+<img src="triple-letter.png"/>
+<img src="triple-word.png"/>
+<img src="standard.png"/>
+<br/>
+<div id='playfield'>
+ <div id='field-0-0'/></div>
+ <div id='field-0-1'/></div>
+ <div id='field-0-2'/></div>
+ <div id='field-0-3'/></div>
+ <div id='field-0-4'/></div>
+ <div id='field-0-5'/></div>
+ <div id='field-0-6'/></div>
+ <div id='field-0-7'/></div>
+ <div id='field-0-8'/></div>
+ <div id='field-0-9'/></div>
+ <div id='field-0-10'/></div>
+ <div id='field-0-11'/></div>
+ <div id='field-0-12'/></div>
+ <div id='field-0-13'/></div>
+ <div id='field-0-14'/></div>
+ <div id='field-1-0'/></div>
+ <div id='field-1-1'/></div>
+ <div id='field-1-2'/></div>
+ <div id='field-1-3'/></div>
+ <div id='field-1-4'/></div>
+ <div id='field-1-5'/></div>
+ <div id='field-1-6'/></div>
+ <div id='field-1-7'/></div>
+ <div id='field-1-8'/></div>
+ <div id='field-1-9'/></div>
+ <div id='field-1-10'/></div>
+ <div id='field-1-11'/></div>
+ <div id='field-1-12'/></div>
+ <div id='field-1-13'/></div>
+ <div id='field-1-14'/></div>
+ <div id='field-2-0'/><img src="I.png"/></div>
+ <div id='field-2-1'/><img src="C.png"/></div>
+ <div id='field-2-2'/><img src="H.png"/></div>
+ <div id='field-2-3'/></div>
+ <div id='field-2-4'/></div>
+ <div id='field-2-5'/></div>
+ <div id='field-2-6'/></div>
+ <div id='field-2-7'/></div>
+ <div id='field-2-8'/></div>
+ <div id='field-2-9'/></div>
+ <div id='field-2-10'/></div>
+ <div id='field-2-11'/></div>
+ <div id='field-2-12'/></div>
+ <div id='field-2-13'/></div>
+ <div id='field-2-14'/></div>
+ <div id='field-3-0'/></div>
+ <div id='field-3-1'/></div>
+ <div id='field-3-2'/><img src="L.png"/></div>
+ <div id='field-3-3'/><img src="I.png"/></div>
+ <div id='field-3-4'/><img src="E.png"/></div>
+ <div id='field-3-5'/><img src="B.png"/></div>
+ <div id='field-3-6'/><img src="E.png"/></div>
+ <div id='field-3-7'/></div>
+ <div id='field-3-8'/></div>
+ <div id='field-3-9'/></div>
+ <div id='field-3-10'/></div>
+ <div id='field-3-11'/></div>
+ <div id='field-3-12'/></div>
+ <div id='field-3-13'/></div>
+ <div id='field-3-14'/></div>
+ <div id='field-4-0'/></div>
+ <div id='field-4-1'/></div>
+ <div id='field-4-2'/><img src="D.png"/></div>
+ <div id='field-4-3'/><img src="I.png"/></div>
+ <div id='field-4-4'/><img src="C.png"/></div>
+ <div id='field-4-5'/><img src="H.png"/></div>
+ <div id='field-4-6'/></div>
+ <div id='field-4-7'/></div>
+ <div id='field-4-8'/></div>
+ <div id='field-4-9'/></div>
+ <div id='field-4-10'/></div>
+ <div id='field-4-11'/></div>
+ <div id='field-4-12'/></div>
+ <div id='field-4-13'/></div>
+ <div id='field-4-14'/></div>
+ <div id='field-5-0'/></div>
+ <div id='field-5-1'/></div>
+ <div id='field-5-2'/></div>
+ <div id='field-5-3'/></div>
+ <div id='field-5-4'/></div>
+ <div id='field-5-5'/></div>
+ <div id='field-5-6'/></div>
+ <div id='field-5-7'/></div>
+ <div id='field-5-8'/></div>
+ <div id='field-5-9'/></div>
+ <div id='field-5-10'/></div>
+ <div id='field-5-11'/></div>
+ <div id='field-5-12'/></div>
+ <div id='field-5-13'/></div>
+ <div id='field-5-14'/></div>
+ <div id='field-6-0'/></div>
+ <div id='field-6-1'/></div>
+ <div id='field-6-2'/></div>
+ <div id='field-6-3'/></div>
+ <div id='field-6-4'/></div>
+ <div id='field-6-5'/></div>
+ <div id='field-6-6'/></div>
+ <div id='field-6-7'/></div>
+ <div id='field-6-8'/></div>
+ <div id='field-6-9'/></div>
+ <div id='field-6-10'/></div>
+ <div id='field-6-11'/></div>
+ <div id='field-6-12'/></div>
+ <div id='field-6-13'/></div>
+ <div id='field-6-14'/></div>
+ <div id='field-7-0'/></div>
+ <div id='field-7-1'/></div>
+ <div id='field-7-2'/></div>
+ <div id='field-7-3'/></div>
+ <div id='field-7-4'/></div>
+ <div id='field-7-5'/></div>
+ <div id='field-7-6'/></div>
+ <div id='field-7-7'/></div>
+ <div id='field-7-8'/></div>
+ <div id='field-7-9'/></div>
+ <div id='field-7-10'/></div>
+ <div id='field-7-11'/></div>
+ <div id='field-7-12'/></div>
+ <div id='field-7-13'/></div>
+ <div id='field-7-14'/></div>
+ <div id='field-8-0'/></div>
+ <div id='field-8-1'/></div>
+ <div id='field-8-2'/></div>
+ <div id='field-8-3'/></div>
+ <div id='field-8-4'/></div>
+ <div id='field-8-5'/></div>
+ <div id='field-8-6'/></div>
+ <div id='field-8-7'/></div>
+ <div id='field-8-8'/></div>
+ <div id='field-8-9'/></div>
+ <div id='field-8-10'/></div>
+ <div id='field-8-11'/></div>
+ <div id='field-8-12'/></div>
+ <div id='field-8-13'/></div>
+ <div id='field-8-14'/></div>
+ <div id='field-9-0'/></div>
+ <div id='field-9-1'/></div>
+ <div id='field-9-2'/></div>
+ <div id='field-9-3'/></div>
+ <div id='field-9-4'/></div>
+ <div id='field-9-5'/></div>
+ <div id='field-9-6'/></div>
+ <div id='field-9-7'/></div>
+ <div id='field-9-8'/></div>
+ <div id='field-9-9'/></div>
+ <div id='field-9-10'/></div>
+ <div id='field-9-11'/></div>
+ <div id='field-9-12'/></div>
+ <div id='field-9-13'/></div>
+ <div id='field-9-14'/></div>
+ <div id='field-10-0'/></div>
+ <div id='field-10-1'/></div>
+ <div id='field-10-2'/></div>
+ <div id='field-10-3'/></div>
+ <div id='field-10-4'/></div>
+ <div id='field-10-5'/></div>
+ <div id='field-10-6'/></div>
+ <div id='field-10-7'/></div>
+ <div id='field-10-8'/></div>
+ <div id='field-10-9'/></div>
+ <div id='field-10-10'/></div>
+ <div id='field-10-11'/></div>
+ <div id='field-10-12'/></div>
+ <div id='field-10-13'/></div>
+ <div id='field-10-14'/></div>
+ <div id='field-11-0'/></div>
+ <div id='field-11-1'/></div>
+ <div id='field-11-2'/></div>
+ <div id='field-11-3'/></div>
+ <div id='field-11-4'/></div>
+ <div id='field-11-5'/></div>
+ <div id='field-11-6'/></div>
+ <div id='field-11-7'/></div>
+ <div id='field-11-8'/></div>
+ <div id='field-11-9'/></div>
+ <div id='field-11-10'/></div>
+ <div id='field-11-11'/></div>
+ <div id='field-11-12'/></div>
+ <div id='field-11-13'/></div>
+ <div id='field-11-14'/></div>
+ <div id='field-12-0'/></div>
+ <div id='field-12-1'/></div>
+ <div id='field-12-2'/></div>
+ <div id='field-12-3'/></div>
+ <div id='field-12-4'/></div>
+ <div id='field-12-5'/></div>
+ <div id='field-12-6'/></div>
+ <div id='field-12-7'/></div>
+ <div id='field-12-8'/></div>
+ <div id='field-12-9'/></div>
+ <div id='field-12-10'/></div>
+ <div id='field-12-11'/></div>
+ <div id='field-12-12'/></div>
+ <div id='field-12-13'/></div>
+ <div id='field-12-14'/></div>
+ <div id='field-13-0'/></div>
+ <div id='field-13-1'/></div>
+ <div id='field-13-2'/></div>
+ <div id='field-13-3'/></div>
+ <div id='field-13-4'/></div>
+ <div id='field-13-5'/></div>
+ <div id='field-13-6'/></div>
+ <div id='field-13-7'/></div>
+ <div id='field-13-8'/></div>
+ <div id='field-13-9'/></div>
+ <div id='field-13-10'/></div>
+ <div id='field-13-11'/></div>
+ <div id='field-13-12'/></div>
+ <div id='field-13-13'/></div>
+ <div id='field-13-14'/></div>
+ <div id='field-14-0'/></div>
+ <div id='field-14-1'/></div>
+ <div id='field-14-2'/></div>
+ <div id='field-14-3'/></div>
+ <div id='field-14-4'/></div>
+ <div id='field-14-5'/></div>
+ <div id='field-14-6'/></div>
+ <div id='field-14-7'/></div>
+ <div id='field-14-8'/></div>
+ <div id='field-14-9'/></div>
+ <div id='field-14-10'/></div>
+ <div id='field-14-11'/></div>
+ <div id='field-14-12'/></div>
+ <div id='field-14-13'/></div>
+ <div id='field-14-14'/></div>
+</div>
+</body>
\ No newline at end of file

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/triple-letter.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/triple-letter.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/trunk-reorg/bknr/projects/scrabble/website/de/triple-word.png
===================================================================
(Binary files differ)


Property changes on: branches/trunk-reorg/bknr/projects/scrabble/website/de/triple-word.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream




More information about the Bknr-cvs mailing list