[bknr-cvs] r2285 - in branches/trunk-reorg/projects/scrabble: src website website/images/de website/images/en

bknr at bknr.net bknr at bknr.net
Sun Nov 25 05:37:33 UTC 2007


Author: hhubner
Date: 2007-11-25 00:37:30 -0500 (Sun, 25 Nov 2007)
New Revision: 2285

Added:
   branches/trunk-reorg/projects/scrabble/website/images/de/A-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/B-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/C-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/D-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/E-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/F-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/G-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/H-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/I-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/J-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/K-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/L-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/M-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/N-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/O-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/P-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/Q-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/R-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/S-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/T-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/U-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/V-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/W-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/X-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/Y-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/Z-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/null-blank.png
   branches/trunk-reorg/projects/scrabble/website/images/de/null.png
   branches/trunk-reorg/projects/scrabble/website/images/de/start-field.png
   branches/trunk-reorg/projects/scrabble/website/images/en/null.png
Removed:
   branches/trunk-reorg/projects/scrabble/website/images/de/NIL.png
   branches/trunk-reorg/projects/scrabble/website/images/en/NIL.png
Modified:
   branches/trunk-reorg/projects/scrabble/src/game.lisp
   branches/trunk-reorg/projects/scrabble/src/make-letters.lisp
   branches/trunk-reorg/projects/scrabble/src/package.lisp
   branches/trunk-reorg/projects/scrabble/src/rules.lisp
   branches/trunk-reorg/projects/scrabble/src/web.lisp
   branches/trunk-reorg/projects/scrabble/website/images/de/charmap.xml
   branches/trunk-reorg/projects/scrabble/website/images/de/double-letter.png
   branches/trunk-reorg/projects/scrabble/website/images/de/double-word.png
   branches/trunk-reorg/projects/scrabble/website/images/de/triple-letter.png
   branches/trunk-reorg/projects/scrabble/website/images/de/triple-word.png
   branches/trunk-reorg/projects/scrabble/website/scrabble.css
   branches/trunk-reorg/projects/scrabble/website/scrabble.html
   branches/trunk-reorg/projects/scrabble/website/scrabble.js
Log:
Checkpoint:  Various gameplay fixes, add start-field with star, add second
set of letter tiles with red lettering to signify placed blank tiles.  Fix
json encoding for IE.


Modified: branches/trunk-reorg/projects/scrabble/src/game.lisp
===================================================================
--- branches/trunk-reorg/projects/scrabble/src/game.lisp	2007-11-17 10:28:57 UTC (rev 2284)
+++ branches/trunk-reorg/projects/scrabble/src/game.lisp	2007-11-25 05:37:30 UTC (rev 2285)
@@ -62,10 +62,11 @@
 
 (defmethod print-object ((participant participant) stream)
   (print-unreadable-object (participant stream :type t)
-    (format stream "~A score: ~A, ~A tile~:P"
+    (format stream "~A score: ~A, ~A tile~:P: ~{~A~^, ~}"
 	    (user-login (player-of participant))
 	    (score-of participant)
-	    (length (tray-of participant)))))
+	    (length (tray-of participant))
+            (mapcar #'letter-of (tray-of participant)))))
 
 (defmethod tray-size ((participant participant))
   (length (tray-of participant)))
@@ -133,7 +134,7 @@
   (eq participant (next-participant-of game)))
 
 (defun ensure-participants-turn (game participant)
-  (unless (participants-turn-p game participant) 
+  (unless (participants-turn-p game participant)
     (error "It's not ~A's turn." (user-login (player-of participant)))))
 
 (defun rotate-participants (game)
@@ -150,6 +151,12 @@
 (defmethod letter-equal ((letter1 character) (letter2 (eql nil)))
   nil)
 
+(defmethod letter-equal ((letter1 (eql nil)) (letter2 character))
+  nil)
+
+(defmethod letter-equal ((letter1 (eql nil)) (letter2 (eql nil)))
+  t)
+
 (defmethod letter-equal ((tile1 tile) (tile2 tile))
   (letter-equal (letter-of tile1) (letter-of tile2)))
 
@@ -157,9 +164,9 @@
   (let ((tray-letters (mapcar #'letter-of (tray-of participant)))
 	(placed-letters (mapcar (compose #'letter-of #'tile-of) placed-tiles)))
     (dolist (letter placed-letters)
-      (let ((has-letter (find letter tray-letters :test #'letter-equal)))
+      (let ((has-letter (position letter tray-letters :test #'letter-equal)))
 	(unless (or has-letter (find nil tray-letters))
-	  (error "participant ~A does not have tile ~A" participant letter))
+          (error "participant ~A does not have tile ~A" participant letter))
 	(setf tray-letters
 	      (if has-letter
 		  (remove letter tray-letters :test #'letter-equal :count 1)
@@ -180,9 +187,12 @@
     drawn))
 
 (deftransaction make-move% (game participant placed-tiles)
+  (dolist (placed-tile placed-tiles)
+    (when (used-for placed-tile)
+      (setf (used-for (tile-of placed-tile)) (used-for placed-tile))))
   (let ((words-formed (mapcar (lambda (word-result)
 				(cons (word-text word-result) (word-score word-result)))
-			      (words-formed (board-of game) placed-tiles))))
+                              (words-formed (board-of game) placed-tiles))))
     (dolist (placed-tile placed-tiles)
       (put-letter (board-of game) (tile-of placed-tile) (x-of placed-tile) (y-of placed-tile)))
     (let ((tiles-used (remove-letters-from-participant-tray participant (mapcar #'tile-of placed-tiles)))
@@ -206,7 +216,10 @@
   (ensure-participant-has-tiles participant placed-tiles)
   (check-move-legality (board-of game) placed-tiles)
   (make-move% game participant (mapcar (lambda (placement)
-					 (list (x-of placement) (y-of placement) (tile-of placement)))
+					 (list (x-of placement)
+                                               (y-of placement)
+                                               (tile-of placement)
+                                               (used-for placement)))
 				       placed-tiles)))
 
 (defclass move-withdrawal (store-object)

Modified: branches/trunk-reorg/projects/scrabble/src/make-letters.lisp
===================================================================
--- branches/trunk-reorg/projects/scrabble/src/make-letters.lisp	2007-11-17 10:28:57 UTC (rev 2284)
+++ branches/trunk-reorg/projects/scrabble/src/make-letters.lisp	2007-11-25 05:37:30 UTC (rev 2285)
@@ -39,23 +39,30 @@
 
 (defparameter *tile-color* '(1.0 0.98 0.8))
 
-(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*))
+(defparameter *bold-font* #.(merge-pathnames #p"/home/hans/fonts/DIN/DINMd___.ttf" *default-pathname-defaults*))
+(defparameter *regular-font* #.(merge-pathnames #p"/home/hans/fonts/DIN/DINRg___.ttf" *default-pathname-defaults*))
 
-(defun make-letter-tile (char score)
+(defun make-letter-tile (char score blank-used)
   (with-canvas (:width 34 :height 34)
     (let* ((bold-font (get-font *bold-font*))
 	   (regular-font (get-font *regular-font*))
 	   (char-string (princ-to-string char))
-	   (pathname (make-pathname :name (if (and char (> (char-code char) 127))
-					      (char-name char)
-					      char-string)
+           (filename (format nil "~A~@[-blank~]"
+                             (if char
+                                 (if (> (char-code char) 127)
+                                     (char-name char)
+                                     char-string)
+                                 "null")
+                             blank-used))
+           (pathname (make-pathname :name filename
 				    :type "png")))
       (apply #'set-rgb-fill *tile-color*)
       (rounded-rectangle 0 0 34 34 4 4)
       (fill-path)
       (when char
-	(set-rgb-fill 0 0 0)
+        (if (and blank-used char)
+            (set-rgb-fill 0.9 0 0)
+            (set-rgb-fill 0 0 0))
 	(set-font bold-font 27)
 	(draw-centered-string 13 7 char-string)
 	(set-font regular-font 11)
@@ -77,11 +84,12 @@
 				   :external-format :utf-8)
     (cxml:with-xml-output (cxml:make-character-stream-sink letter-map-file)
       (cxml:with-element "chars"
-	(dolist (entry (gethash language *tile-sets*))
+	(dolist (entry (getf *tile-sets* language))
 	  (destructuring-bind (letter score count) entry
 	    (declare (ignore count))
 	    (cxml:with-element "char"
-	      (cxml:attribute "filename" (namestring (make-letter-tile letter score)))
+	      (cxml:attribute "filename" (namestring (make-letter-tile letter score nil)))
+	      (cxml:attribute "blank-filename" (namestring (make-letter-tile letter score t)))
 	      (cxml:text (princ-to-string letter)))))))))
 
 (defun make-cursor ()
@@ -92,6 +100,21 @@
     (stroke)
     (save-png #P"cursor.png")))
 
+(defun draw-star (size border)
+  (with-graphics-state
+    (let ((half-size (/ size 2))
+          (angle 0)
+          (step (* 2 (/ (* pi 2) 5))))
+      (translate (+ border half-size) (+ border half-size))
+      (move-to 0 half-size)
+      (dotimes (i 5)
+        (setf angle (+ angle step))
+        (line-to (* (sin angle) half-size)
+                 (* (cos angle) half-size)))
+      (close-subpath)
+      (set-rgb-fill 0 0 0)
+      (fill-path))))
+
 (defun make-special-field (name color &key text star)
   (with-canvas (:width 40 :height 40)
     (let ((regular-font (get-font *regular-font*)))
@@ -108,7 +131,7 @@
 	     (draw-centered-string 20 position line)
 	     (decf position 6))))
 	(star
-	 ))
+	 (draw-star 30 5)))
       (save-png (make-pathname :name (string-downcase (symbol-name name)) :type "png")))))
 
 (defun make-special-field-set (language)
@@ -117,7 +140,7 @@
 			(getf *special-field-colors* tile-name)
 			:text (getf (gethash language *special-field-texts*) tile-name)))
   (make-special-field :standard (getf *special-field-colors* :standard) :star nil)
-  (make-special-field :standard (getf *special-field-colors* :double-word) :star t))
+  (make-special-field :start-field (getf *special-field-colors* :double-word) :star t))
 
 (defun make-tile-set (directory language)
   (let ((*default-pathname-defaults*
@@ -128,3 +151,21 @@
     (make-letter-tile-set language)
     (make-special-field-set language)
     (make-cursor)))
+
+
+
+(defun star-test (size border)
+  (with-canvas (:width size :height size)
+    (let ((star-size (/ (- size (* 2 border)) 2))
+          (angle 0)
+          (step (* 2 (/ (* pi 2) 5))))
+      (translate (+ border star-size) (+ border star-size))
+      (move-to 0 star-size)
+      (dotimes (i 5)
+        (setf angle (+ angle step))
+        (line-to (* (sin angle) star-size)
+                 (* (cos angle) star-size)))
+      (close-subpath)
+      (set-rgb-fill 0 0 0)
+      (fill-path)
+      (save-png "/home/hans/bknr-svn/projects/scrabble/website/images/de/star.png"))))

Modified: branches/trunk-reorg/projects/scrabble/src/package.lisp
===================================================================
--- branches/trunk-reorg/projects/scrabble/src/package.lisp	2007-11-17 10:28:57 UTC (rev 2284)
+++ branches/trunk-reorg/projects/scrabble/src/package.lisp	2007-11-25 05:37:30 UTC (rev 2285)
@@ -12,7 +12,10 @@
 
 	   "TILE"
 	   "LETTER-OF"
+	   "LETTER-NAME-OF"
 	   "VALUE-OF"
+           "BLANK-TILE"
+           "USED-FOR"
 
 	   "BOARD"
 	   "AT-XY"
@@ -43,6 +46,9 @@
 	   "MOVE-WITHDRAWAL"
 	   "REASON-OF"
 
+           "TILE-SWAP"
+           "COUNT-OF"
+
 	   "GAME"
 	   "LANGUAGE-OF"
 	   "PARTICIPANTS-OF"

Modified: branches/trunk-reorg/projects/scrabble/src/rules.lisp
===================================================================
--- branches/trunk-reorg/projects/scrabble/src/rules.lisp	2007-11-17 10:28:57 UTC (rev 2284)
+++ branches/trunk-reorg/projects/scrabble/src/rules.lisp	2007-11-25 05:37:30 UTC (rev 2285)
@@ -24,15 +24,20 @@
 (defclass tile-placement ()
   ((x :reader x-of :initarg :x)
    (y :reader y-of :initarg :y)
-   (tile :reader tile-of :initarg :tile))
+   (tile :reader tile-of :initarg :tile)
+   (used-for :reader used-for :initarg :used-for))
   (:documentation "Represents placement of a letter tile on the board"))
 
 (defmethod print-object ((tile-placement tile-placement) stream)
   (print-unreadable-object (tile-placement stream :type t)
-    (format stream "~A ~A => ~A" (x-of tile-placement) (y-of tile-placement) (tile-of tile-placement))))
+    (format stream "~A ~A => ~A ~@[(~A)~]"
+            (x-of tile-placement)
+            (y-of tile-placement)
+            (tile-of tile-placement)
+            (used-for tile-placement))))
 
-(defun make-tile-placement (x y tile)
-  (make-instance 'tile-placement :x x :y y :tile tile))
+(defun make-tile-placement (x y tile used-for)
+  (make-instance 'tile-placement :x x :y y :tile tile :used-for used-for))
 
 (defun make-tile-placements (list-of-moves)
   (mapcar (curry #'apply 'make-tile-placement) list-of-moves))
@@ -60,7 +65,7 @@
     (terpri stream)
     (dotimes (x 15)
       (dotimes (y 15)
-        (format stream "~C " (aif (at-xy board x y) (letter-of it) #\.)))
+        (format stream "~C " (aif (at-xy board x y) (used-for it) #\.)))
       (terpri stream))))
 
 (defmethod at-xy ((board board) x y)
@@ -77,14 +82,47 @@
    (value :reader value-of :initarg :value))
   (:metaclass persistent-class))
 
+(defmethod used-for ((tile tile))
+  (letter-of tile))
+
+(defclass blank-tile (tile)
+  ((used-for :accessor used-for :initform nil))
+  (:default-initargs :letter nil :value 0)
+  (:metaclass persistent-class))
+
+(defmethod letter-name-of ((character character))
+  (if (and (char-name character)
+           (< 127 (char-code character)))
+      (string-upcase (char-name character))
+      (make-string 1 :initial-element character)))
+
+(defmethod letter-name-of ((tile tile))
+  (letter-name-of (letter-of tile)))
+
+(defmethod letter-name-of ((tile blank-tile))
+  (awhen (used-for tile)
+    (letter-name-of it)))
+
 (defmethod print-object ((tile tile) stream)
   (print-unreadable-object (tile stream :type t :identity nil)
     (with-slots (letter value) tile
-      (format stream "~A (~A) ID:~A" (when letter (char-name letter)) value (store-object-id tile)))))
+      (format stream "~A (~A) ID:~A" (when letter (letter-name-of letter)) value (store-object-id tile)))))
 
-(defun make-tile (letter value)
+(defmethod print-object ((tile blank-tile) stream)
+  (print-unreadable-object (tile stream :type t :identity nil)
+    (with-slots (letter value) tile
+      (format stream "~@[used for ~A ~]ID:~A"
+              (when (used-for tile)
+                (letter-name-of (used-for tile)))
+              (store-object-id tile)))))
+
+(defmethod make-tile ((letter character) value)
   (make-object 'tile :letter letter :value value))
 
+(defmethod make-tile ((letter (eql nil)) value)
+  (declare (ignore value))
+  (make-object 'blank-tile))
+
 (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."
@@ -125,7 +163,7 @@
     (error 'not-in-a-row))
 
   (when (some (curry #'at-placement board) placed-tiles)
-    (error 'tile-placed-on-occupied-field))
+    (error 'placed-on-occupied-field))
 
   (unless (equal placed-tiles
                  (remove-duplicates placed-tiles :test #'equal-position))
@@ -142,7 +180,7 @@
   (unless (or (find '(7 7) placed-tiles :test #'position-equal)
               (some (curry #'placed-tile-adjacent board) placed-tiles))
     (error 'not-touching-other-tile))
-  
+
   t)
 
 (defmethod x-of ((placement list))
@@ -154,6 +192,9 @@
 (defmethod tile-of ((placement list))
   (third placement))
 
+(defmethod used-for ((placement list))
+  (fourth placement))
+
 (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
@@ -164,11 +205,13 @@
       (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)))
+            (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))
+                (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
@@ -205,5 +248,4 @@
 (defun word-text (word-result)
   "Convert the letter in a word result returned by WORDS-FORMED to a
 string."
-  (coerce (mapcar (compose #'letter-of #'car) word-result) 'string))
-
+  (coerce (mapcar (compose #'used-for #'car) word-result) 'string))

Modified: branches/trunk-reorg/projects/scrabble/src/web.lisp
===================================================================
--- branches/trunk-reorg/projects/scrabble/src/web.lisp	2007-11-17 10:28:57 UTC (rev 2284)
+++ branches/trunk-reorg/projects/scrabble/src/web.lisp	2007-11-25 05:37:30 UTC (rev 2285)
@@ -6,27 +6,43 @@
 
 (defun encode-json-plist (plist stream)
   (princ #\{ stream)
-  (loop for (key value) on plist by #'cddr
+  (loop for (key value &rest rest) on plist by #'cddr
 	do (encode-json key stream)
 	do (princ #\: stream)
 	do (encode-json value stream)
+        when rest
 	do (princ #\, stream))
   (princ #\} stream))
 
 (defmethod encode-json ((object store-object) stream)
-  (princ #\{ stream)
-  (dolist (slotdef (closer-mop:class-slots (class-of object)))
-    (when (and (slot-boundp object (closer-mop:slot-definition-name slotdef))
-	       (not (find (closer-mop:slot-definition-name slotdef) *ignore-slots*)))
-      (encode-json (closer-mop:slot-definition-name slotdef) stream)
-      (princ #\: stream)
-      (encode-json (slot-value object (closer-mop:slot-definition-name slotdef)) stream)
-      (princ #\, stream)))
-  (princ #\} stream))
+  (let (printed)
+    (princ #\{ stream)
+    (dolist (slotdef (closer-mop:class-slots (class-of object)))
+      (when (and (slot-boundp object (closer-mop:slot-definition-name slotdef))
+                 (not (find (closer-mop:slot-definition-name slotdef) *ignore-slots*)))
+        (if printed
+            (princ #\, stream)
+            (setf printed t))
+        (encode-json (closer-mop:slot-definition-name slotdef) stream)
+        (princ #\: stream)
+        (encode-json (slot-value object (closer-mop:slot-definition-name slotdef)) stream)))
+    (princ #\} stream)))
 
 (defmethod encode-json ((tile-bag tile-bag) stream)
   (encode-json-plist (list :remaining-tiles (remaining-tile-count tile-bag)) stream))
 
+(defmethod encode-json ((tile tile) stream)
+  (encode-json-plist (list :letter (letter-name-of tile)
+                           :value (value-of tile))
+                       stream))
+
+(defmethod encode-json ((tile blank-tile) stream)
+  (encode-json-plist (append (list :letter nil
+                                   :value 0)
+                             (awhen (used-for tile)
+                               (list :used-for it)))
+                     stream))
+
 (defmethod encode-json ((move move) stream)
   (encode-json-plist (list :type "move"
 			   :participant-login (user-login (player-of (participant-of move)))
@@ -44,17 +60,30 @@
 			   :reason (or (reason-of move) ""))
 		     stream))
 
+(defmethod encode-json ((move tile-swap) stream)
+  (encode-json-plist (list :type "tile-swap"
+			   :participant-login (user-login (player-of (participant-of move)))
+			   :reason (count-of move))
+		     stream))
+
 (defmethod encode-json ((board board) stream)
-  (princ #\[ stream)
-  (dotimes (x 15)
-    (dotimes (y 15)
-      (awhen (at-xy board x y)
-	(encode-json (list x y (letter-of it) (value-of it)) stream)
-	(princ #\, stream))))
-  (princ #\] stream))
+  (let (printed)
+    (princ #\[ stream)
+    (dotimes (x 15)
+      (dotimes (y 15)
+        (awhen (at-xy board x y)
+          (if printed
+              (princ #\, stream)
+              (setf printed t))
+          (encode-json (append (list x y (letter-name-of it))
+                               (when (typep it 'scrabble::blank-tile)
+                                 (list 1)))
+                       stream))))
+    (princ #\] stream)))
 
 (defmethod encode-json ((participant participant) stream)
   (start-session)
+  (format t "user: ~A~%" (session-value :user))
   (encode-json-plist (append (list :login (user-login (player-of participant))
 				   :name (user-full-name (player-of participant))
                                    :remaining-tiles)
@@ -84,27 +113,31 @@
 	      (:tr (:td) (:td (:input :type "SUBMIT")))))))))
 
 (defun parse-move (participant string)
-  "Given a string X1,Y1,LETTER1,X2,Y2,LETTER2..., return a list of
-moves ((X1 Y1 LETTER-TILE2) (X2 Y2 LETTER-TILE2) ...).  LETTERx may
-either be a single-character letter which will be used directly or a
-character name (like LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS) which will
-be converted into a character using NAME-CHAR."
+  "Given a string X1,Y1,LETTER1,FLAG1,X2,Y2,LETTER2,FLAG2..., return a
+list of moves ((X1 Y1 LETTER-TILE1 FLAG1) (X2 Y2 LETTER-TILE2 FLAG2)
+...).  LETTERx may either be a single-character letter which will be
+used directly or a character name (like
+LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS) which will be converted into a
+character using NAME-CHAR."
   (let ((tray (tray-of participant))
 	list-of-moves)
     (labels
-	((use-letter (letter)
-	   (awhen (or (find letter tray :key #'letter-of)
-		      (find nil tray :key #'letter-of))
+	((use-letter (letter is-blank)
+           (format t "use-letter ~A ~A~%" letter is-blank)
+	   (awhen (find (if is-blank nil letter) tray :key #'letter-of)
 	     (setf tray (remove it tray))
 	     (return-from use-letter it))
 	   (error "tray of ~A does not contain letter ~A" participant letter))
-	 (recurse (x-string y-string letter &rest more)
-	   (push (list (parse-integer x-string)
-		       (parse-integer y-string)
-		       (use-letter (if (= 1 (length letter))
-				       (aref letter 0)
-				       (name-char letter))))
-		 list-of-moves)
+	 (recurse (x-string y-string letter is-blank &rest more)
+           (let ((letter (if (= 1 (length letter))
+                             (aref letter 0)
+                             (name-char letter)))
+                 (is-blank (string-equal "true" is-blank)))
+             (push (list (parse-integer x-string)
+                         (parse-integer y-string)
+                         (use-letter letter is-blank)
+                         (when is-blank letter))
+                   list-of-moves))
 	   (when more
 	     (apply #'recurse more))))
       (apply #'recurse (split "," string)))

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

Modified: branches/trunk-reorg/projects/scrabble/website/images/de/charmap.xml
===================================================================
--- branches/trunk-reorg/projects/scrabble/website/images/de/charmap.xml	2007-11-17 10:28:57 UTC (rev 2284)
+++ branches/trunk-reorg/projects/scrabble/website/images/de/charmap.xml	2007-11-25 05:37:30 UTC (rev 2285)
@@ -1,2 +1,2 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<chars><char filename="A.png">A</char><char filename="B.png">B</char><char filename="C.png">C</char><char filename="D.png">D</char><char filename="E.png">E</char><char filename="F.png">F</char><char filename="G.png">G</char><char filename="H.png">H</char><char filename="I.png">I</char><char filename="J.png">J</char><char filename="K.png">K</char><char filename="L.png">L</char><char filename="M.png">M</char><char filename="N.png">N</char><char filename="O.png">O</char><char filename="P.png">P</char><char filename="Q.png">Q</char><char filename="R.png">R</char><char filename="S.png">S</char><char filename="T.png">T</char><char filename="U.png">U</char><char filename="V.png">V</char><char filename="W.png">W</char><char filename="X.png">X</char><char filename="Y.png">Y</char><char filename="Z.png">Z</char><char filename="LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS.png">Ä</char><char filename="LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS.png">Ö</char><char filename="LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS.png">Ü</char><char filename="NIL.png">NIL</char></chars>
\ No newline at end of file
+<chars><char filename="A.png" blank-filename="A-blank.png">A</char><char filename="B.png" blank-filename="B-blank.png">B</char><char filename="C.png" blank-filename="C-blank.png">C</char><char filename="D.png" blank-filename="D-blank.png">D</char><char filename="E.png" blank-filename="E-blank.png">E</char><char filename="F.png" blank-filename="F-blank.png">F</char><char filename="G.png" blank-filename="G-blank.png">G</char><char filename="H.png" blank-filename="H-blank.png">H</char><char filename="I.png" blank-filename="I-blank.png">I</char><char filename="J.png" blank-filename="J-blank.png">J</char><char filename="K.png" blank-filename="K-blank.png">K</char><char filename="L.png" blank-filename="L-blank.png">L</char><char filename="M.png" blank-filename="M-blank.png">M</char><char filename="N.png" blank-filename="N-blank.png">N</char><char filename="O.png" blank-filename="O-blank.png">O</char><char filename="P.png" blank-filename="P-blank.png">P</char><char filename="Q.png" blank-filename="Q-blank.png">Q</char><char filename="R.png" blank-filename="R-blank.png">R</char><char filename="S.png" blank-filename="S-blank.png">S</char><char filename="T.png" blank-filename="T-blank.png">T</char><char filename="U.png" blank-filename="U-blank.png">U</char><char filename="V.png" blank-filename="V-blank.png">V</char><char filename="W.png" blank-filename="W-blank.png">W</char><char filename="X.png" blank-filename="X-blank.png">X</char><char filename="Y.png" blank-filename="Y-blank.png">Y</char><char filename="Z.png" blank-filename="Z-blank.png">Z</char><char filename="LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS.png" blank-filename="LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS-blank.png">Ä</char><char filename="LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS.png" blank-filename="LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS-blank.png">Ö</char><char filename="LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS.png" blank-filename="LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS-blank.png">Ü</char><char filename="null.png" blank-filename="null-blank.png">NIL</char></chars>
\ No newline at end of file

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

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

Added: branches/trunk-reorg/projects/scrabble/website/images/de/null-blank.png
===================================================================
(Binary files differ)


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

Copied: branches/trunk-reorg/projects/scrabble/website/images/de/null.png (from rev 2277, branches/trunk-reorg/projects/scrabble/website/images/de/NIL.png)

Added: branches/trunk-reorg/projects/scrabble/website/images/de/start-field.png
===================================================================
(Binary files differ)


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

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

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

Deleted: branches/trunk-reorg/projects/scrabble/website/images/en/NIL.png
===================================================================
(Binary files differ)

Copied: branches/trunk-reorg/projects/scrabble/website/images/en/null.png (from rev 2277, branches/trunk-reorg/projects/scrabble/website/images/en/NIL.png)

Modified: branches/trunk-reorg/projects/scrabble/website/scrabble.css
===================================================================
--- branches/trunk-reorg/projects/scrabble/website/scrabble.css	2007-11-17 10:28:57 UTC (rev 2284)
+++ branches/trunk-reorg/projects/scrabble/website/scrabble.css	2007-11-25 05:37:30 UTC (rev 2285)
@@ -1,2 +1,2 @@
 body { background-color: #004B36; color: #ffffff; font-family: sans-serif }
-#playfield { position: absolute }
+#playfield { position: absolute; top: 0px; left: 0px }

Modified: branches/trunk-reorg/projects/scrabble/website/scrabble.html
===================================================================
--- branches/trunk-reorg/projects/scrabble/website/scrabble.html	2007-11-17 10:28:57 UTC (rev 2284)
+++ branches/trunk-reorg/projects/scrabble/website/scrabble.html	2007-11-25 05:37:30 UTC (rev 2285)
@@ -10,7 +10,7 @@
   <script type="text/javascript" src="scrabble.js"> </script>
  </head>
  <body onload="init()">
-  <div id='playfield'>
+  <div id="playfield">
   </div>
   <div style="position: absolute; right: 20px; top: 20px;"><a style="color: white;" href="/login?login=user1">user1</a></div>
   <div style="position: absolute; right: 20px; top: 40px;"><a style="color: white;" href="/login?login=user2">user2</a></div>

Modified: branches/trunk-reorg/projects/scrabble/website/scrabble.js
===================================================================
--- branches/trunk-reorg/projects/scrabble/website/scrabble.js	2007-11-17 10:28:57 UTC (rev 2284)
+++ branches/trunk-reorg/projects/scrabble/website/scrabble.js	2007-11-25 05:37:30 UTC (rev 2285)
@@ -39,7 +39,7 @@
     // return if the move is legal.
 
     var positions = map(function (placement) { return [ placement[0], placement[1] ] }, placedTiles)
-	.sort(function (a, b) { (a[0] > b[0]) || (a[1] > b[1])});
+	.sort(function (a, b) { return (a[0] - b[0]) || (a[1] - b[1])});
 
     if (filter(partial(operator.ne, positions[0][0]), map(function (position) { return position[0] }, positions)).length
 	&& filter(partial(operator.ne, positions[0][1]), map(function (position) { return position[1] }, positions)).length) {
@@ -59,8 +59,8 @@
 
     if (findValue(positions, [ 7, 7 ]) == -1) {
 	var found = false;
-	for (var x = startOfPlacement[0]; !found && x <= endOfPlacement[0]; x++) {
-	    for (var y = startOfPlacement[1]; !found && y <= endOfPlacement[1]; y++) {
+	for (var x = startOfPlacement[0]; !found && (x <= endOfPlacement[0]); x++) {
+	    for (var y = startOfPlacement[1]; !found && (y <= endOfPlacement[1]); y++) {
 		if (((x > 0) && letterAt(x - 1, y))
 		    || ((x < 14) && letterAt(x + 1, y))
 		    || ((y > 0) && letterAt(x, y - 1))
@@ -83,6 +83,7 @@
 }
 
 var theirTrays;
+var tray = [];
 
 var gameID = 108;
 var board;
@@ -99,7 +100,8 @@
 	    element.style.position = 'absolute';
 	    element.style.width = '40px';
 	    element.style.height = '40px';
-	    element.style.backgroundImage = 'url(images/' + getFieldScore(x, y) + '.png)';
+            var imageName = (x == 7 && y == 7) ? "start-field" : getFieldScore(x, y);
+	    element.style.backgroundImage = 'url(images/' + imageName + '.png)';
 	    element.x = x;
 	    element.y = y;
 	    setElementPosition(element, { x: border + x * 44, y: border + y * 44 });
@@ -109,13 +111,6 @@
 	appendChildNodes(container, board[x]);
     }
 
-    myTrayContainer = DIV();
-    myTrayContainer.style.position = 'absolute';
-    myTrayContainer.style.width = 7 * 44 + 'px';
-    myTrayContainer.style.height = '44px';
-    setElementPosition(myTrayContainer, { x: border + 194, y: border + 665 });
-    appendChildNodes(container, myTrayContainer);
-
     theirTrays = DIV();
     theirTrays.style.position = 'absolute';
     theirTrays.style.width = 7 * 44 + 'px';
@@ -138,25 +133,34 @@
 //     appendChildNodes(container, clearButton);
 }
 
-function setLetter(x, y, letter, justPlaced) {
-    var image = IMG({ src: 'images/' + letter + '.png'});
+function setLetter(x, y, letter, isBlank) {
+    var image = IMG({ src: 'images/' + letter + (isBlank ? "-blank" : "") + '.png'});
     image.style.position = 'absolute';
     image.style.top = '3px';
     image.style.left = '3px';
-    replaceChildNodes(board[x][y], image);
-    if (justPlaced) {
-        var mask = IMG({ src: 'images/mask.png'});
-        mask.style.position = 'absolute';
-        mask.style.top = '3px';
-        mask.style.left = '3px';
-        appendChildNodes(board[x][y], mask);
-    }
+    setElementPosition(image, { x: border + x * 44 + 3, y: border + y * 44 + 3 });
+    appendChildNodes($('playfield'), image);
     board[x][y].letterNode = image;
     board[x][y].letter = letter;
-    board[x][y].justPlaced = justPlaced;
-    YAHOO.util.Event.purgeElement(board[x][y], false, 'click');
 }
 
+function placeLetter(x, y, tile) {
+    var mask = IMG({ src: 'images/mask.png'});
+    mask.style.position = 'absolute';
+    mask.style.top = '3px';
+    mask.style.left = '3px';
+    mask.style.zIndex = '20';
+    appendChildNodes(board[x][y], mask);
+    board[x][y].letterNode = tile;
+    board[x][y].letter = tile.letter;
+    board[x][y].justPlaced = true;
+    tile.anim = new YAHOO.util.Motion(tile, { points: { to: [ border + x * 44 + 3,
+                                                              border + y * 44 + 3 ]}},
+                                      0.15,
+                                      YAHOO.util.Easing.easeBoth);
+    tile.anim.animate();
+}
+
 function letterAt(x, y) {
     return board[x][y].letter && !board[x][y].justPlaced;
 }
@@ -176,12 +180,14 @@
     this.set = function(x, y) {
 	this.x = x;
 	this.y = y;
-	replaceChildNodes(board[x][y], this.image);
+	appendChildNodes(board[x][y], this.image);
+        board[x][y].cursor = this.image;
     };
 
     this.clear = function() {
 	if (this.x != -1) {
-	    replaceChildNodes(board[this.x][this.y]);
+	    removeElement(board[this.x][this.y].cursor);
+            board[this.x][this.y].cursor = undefined;
 	    this.x = this.y = -1;
 	    this.direction = 0;
 	}
@@ -211,18 +217,8 @@
 	this.direction = direction;
 	if (this.direction == horizontal) {
 	    x++;
-	    for (; x < 15; x++) {
-		if (board[x][y].childNodes.length == 0) {
-		    break;
-		}
-	    }
 	} else {
 	    y++;
-	    for (; y < 15; y++) {
-		if (board[x][y].childNodes.length == 0) {
-		    break;
-		}
-	    }
 	}
 	if ((x != 15) && (y != 15)) {
 	    this.set(x, y);
@@ -239,8 +235,8 @@
 
 var move = [];
 
-function makeMove(x, y, letter) {
-    move[move.length] = [x, y, letter];
+function makeMove(x, y, letter, isBlank) {
+    move[move.length] = [x, y, letter, isBlank];
     try {
 	checkMoveLegality(move);
         $('move').onclick = submitMove;
@@ -299,9 +295,30 @@
     var letter = specialKeyCodes[args[0]] || String.fromCharCode(args[0]);
     var x = cursor.x;
     var y = cursor.y;
-    cursor.advance();
-    setLetter(x, y, letter, true);
-    makeMove(x, y, letter);
+    var tilePosition = -1;
+    for (var i = 0; (tilePosition == -1) && (i < tray.length); i++) {
+        if (tray[i].letter == letter) {
+            tilePosition = i;
+        }
+    }
+    if (tilePosition == -1) {
+        for (var i = 0; (tilePosition == -1) && (i < tray.length); i++) {
+            if (tray[i].letter == undefined) {
+                tilePosition = i;
+            }
+        }
+    }
+    if (tilePosition == -1) {
+        alert("You don't have that letter!");
+    } else {
+        cursor.advance();
+        if (!letterAt(x, y)) {
+            var tile = tray[tilePosition];
+            tray.splice(tilePosition, 1);
+            placeLetter(x, y, tile);
+            makeMove(x, y, letter, tile.letter == undefined);
+        }
+    }
 }
 
 var leftKey = 37;
@@ -358,8 +375,6 @@
     }
 }
 
-var tray;
-
 function trayClick(letter) {
     this.clicked = !this.clicked;
     this.anim = new YAHOO.util.Motion(this, { points: { by: [ 0, (this.clicked ? 15 : -15 ) ]}}, 0.15);
@@ -367,6 +382,7 @@
 }
 
 function makeMyTray(letters) {
+    map(removeElement, tray);
     tray = [];
     for (var i = 0; i < letters.length; i++) {
 	var element = IMG({src: 'images/' + letters[i] + '.png'});
@@ -374,11 +390,13 @@
 	element.style.position = 'absolute';
 	element.style.width = '34px';
 	element.style.height = '34px';
+        element.style.zIndex = '10';
 	element.onclick = trayClick;
-	setElementPosition(element, { x: i * 40 });
+        //	setElementPosition(element, { x: border + 194 + i * 40, y: border + 665 });
+	YAHOO.util.Dom.setXY(element, [ border + 194 + i * 40, border + 665 ]);
 	tray[i] = element;
     }
-    replaceChildNodes(myTrayContainer, tray);
+    appendChildNodes($('playfield'), tray);
 }
 
 function shuffleMyTray() {
@@ -401,7 +419,7 @@
 function addTheirTray (participant) {
     appendChildNodes(theirTrays, DIV(null,
 				     DIV(null, participant.name),
-				     DIV(null, map(function () { return IMG({ src: 'images/NIL.png' }) },
+				     DIV(null, map(function () { return IMG({ src: 'images/null.png' }) },
 						   new Array(participant.remainingTiles)))));
 }
 
@@ -410,7 +428,7 @@
 	var x = gameState.board[i][0];
 	var y = gameState.board[i][1];
 	var char = gameState.board[i][2];
-	setLetter(x, y, char);
+	setLetter(x, y, char, gameState.board[i].length > 3);
     }
     for (var i = 0; i < gameState.participants.length; i++) {
 	var participant = gameState.participants[i];
@@ -451,5 +469,5 @@
     setElementPosition(moveDisplay, { x: border + 550, y: border + 665 });
     appendChildNodes(document.body, moveDisplay);
     var d = loadJSONDoc("/game/" + gameID);
-    d.addCallbacks(drawGameState, alert);
+    d.addCallbacks(drawGameState, function (error) { alert("Request error: " + error.message); });
 }




More information about the Bknr-cvs mailing list