(defframe ("vp" "frame") ()
  "This is the only frame of the Paper Demo application"
  (static-variables (marker 0) (credits 100)  (bet 0) (old-bet 0)
                    (hand nil) (card1 *card-back*) (card2 *card-back*)
                    (card3 *card-back*) (card4 *card-back*) (card5 *card-back*)
		    (holds '(nil nil nil nil nil)) (message "")
                    (mode :bet) (deck (new-deck))
		    (payoff 0) (hand-name ""))
;; modes are :bet :draw :pay
  (form	   (form ("form")))
  (menu-bar	   (("Borrow" "Borrow More Money"
			("10 Credits" (progn (incf #!credits 10)
					     (incf #!marker 10)))
			("50 Credits" (progn (incf #!credits 50)
					     (incf #!marker 50)))
			("100 Credits" (progn (incf #!credits 100)
					     (incf #!marker 100))))
		    ("Payoffs" "Payoff Table"
			("->" nil :left "Royal Flush" :right "500")
			("->" nil :left "Straight Flush" :right "100")
			("->" nil :left "Four of a Kind" :right "25")
			("->" nil :left "Full House" :right "8")
			("->" nil :left "Flush" :right "5")
			("->" nil :left "Straight" :right "4")
			("->" nil :left "Three of a Kind" :right "3")
			("->" nil :left "Two Pair" :right "2")
			("->" nil :left "Jacks or Better" :right "1"))))
  (setup-code
   (progn
    (blet #!hand
	  :var ((c1 #!card1)
		(c2 #!card2)
		(c3 #!card3)
		(c4 #!card4)
		(c5 #!card5))
	  (list c1 c2 c3 c4 c5))
    (set-trigger #!mode
	  '(case #!mode
              (:bet (setf #!message ""
		          #!card1 *card-back*
                          #!card2 *card-back*
                          #!card3 *card-back*
                          #!card4 *card-back*
                          #!card5 *card-back*
			  #!holds (make-list 5)
			  #!deck (new-deck)))
	      (:draw (setf #!card1 (pop #!deck)
			   #!card2 (pop #!deck)
			   #!card3 (pop #!deck)
			   #!card4 (pop #!deck)
			   #!card5 (pop #!deck)))
	      (:pay (unless (first #!holds) (setf #!card1 (pop #!deck)))
	            (unless (second #!holds) (setf #!card2 (pop #!deck)))
	            (unless (third #!holds) (setf #!card3 (pop #!deck)))
	            (unless (fourth #!holds) (setf #!card4 (pop #!deck)))
	            (unless (fifth #!holds) (setf #!card5 (pop #!deck)))
		    (let ((new-val (evaluate #!hand)))
			 (setf #!payoff (second new-val)
			       #!hand-name (first new-val))
			 (incf #!credits (* #!payoff #!bet))
			 (setf #!old-bet #!bet)
			 (setf #!bet 0)
			 (setf #!message 
		     (if (> #!payoff 0)
			 (format nil
		  "~A !!! Your bet of ~D pays out ~D to 1 for a total of ~D!"
		       #!hand-name #!old-bet #!payoff (* #!old-bet #!payoff))
			 "Sorry, Jacks or Better to win"))))))
    (set-trigger #!bet
       '(progn
	 (when (and (eql #!mode :pay) (> #!bet 0))
	       (setf #!mode :bet))
	 (when (>= #!bet *max-bet*)
	       (setf #!mode :draw)))))))
