BUGFIX: reload during the setup could mess up the state machine
[e-DoKo.git] / index.php
index eee9b462f8c906f7f913a585bd5dbb4b2d4b56a7..f5060a077601ea63c1253d5798a04de4b39d3031 100644 (file)
--- a/index.php
+++ b/index.php
@@ -339,24 +339,30 @@ else if(myisset("me"))
     switch($mystatus)
       {
       case 'start':
-       check_want_to_play($me);
-       /* move on to the next stage*/
-       DB_set_hand_status_by_hash($me,'init');
-       break;
+       if( !myisset("in") )
+         {
+           check_want_to_play($me);
+           break;
+         }
+       else
+         {
+           /* move on to the next stage*/
+           DB_set_hand_status_by_hash($me,'init');
+         }
       case 'init':
        /* first check if everything went ok  in the last step
         * if not, send user back, if yes, check what he did
         */
        if( !myisset("in") )
          {
-           echo "<p> you need to answer the <a href=\"$host?me=$me\">question</a>.</p>";
+           echo "<p> You need to answer the <a href=\"$host?me=$me\">question</a>.</p>";
            DB_set_hand_status_by_hash($me,'start');
          }
        else
          {
            if($_REQUEST["in"] == "no")
              {
-               /* cancle the game */
+               /* cancel the game */
                $message = "Hello, \n\n".
                  "the game has been canceled due to the request of one of the players.\n";
                
@@ -372,7 +378,7 @@ else if(myisset("me"))
              }
            else
              {
-               echo "thanks for joining the game...";
+               echo "Thanks for joining the game...";
                
                $mycards = DB_get_hand($me);
                sort($mycards);
@@ -393,17 +399,20 @@ else if(myisset("me"))
       /* ok, user is in the game, saw his cards and selected his vorbehalt
        * so first we check what he selected
        */
-      echo "Processing what you selected in the last step...<br />";
-
       if(!myisset("solo","wedding","poverty","nines") )
        {
          /* all these variables have a pre-selected default,
           * so we should never get here,
-          * unless a user tries to cheat ;) */
-         echo "something went wrong during the setup...please contact the $ADMIN_NAME at $ADMIN_EMAIL.";
+          * unless a user tries to cheat ;)
+          * can also happen if user reloads the page!
+          */
+         echo "<p> You need to answer the <a href=\"$host?me=$me&in=yes\">questions</a>.</p>";
+         DB_set_hand_status_by_hash($me,'init');
        }
       else
        {
+         echo "Processing what you selected in the last step...<br />";
+      
          /* check if this sickness needs to be handled first */
          $gametype    = DB_get_gametype_by_gameid($gameid);
          $startplayer = DB_get_startplayer_by_gameid($gameid);
@@ -493,7 +502,7 @@ else if(myisset("me"))
        * set that one in the Game table
        * tell people about it.
        */
-      echo "<br /> Checking if someone else selected solo, nines or wedding or poverty.<br />";
+      echo "<br /> Checking if someone else selected solo, nines, wedding or poverty.<br />";
       
       /* check if everyone has reached this stage */
       $userids = DB_get_all_userid_by_gameid($gameid);
@@ -561,13 +570,13 @@ else if(myisset("me"))
            }
          else if($nines)
            {
-             /* cancle game */
+             /* cancel game */
              /* TODO: should we keep statistics of this? */
              $message = "Hello, \n\n".
-               "the game has been canceled because ".DB_get_name_by_userid($nines).
-               " has five or more nines and nobody is playing solo.\n";
-             
-             /* TODO: add info about redeal in case this is a game of a series */
+               " the game has been canceled because ".DB_get_name_by_userid($nines).
+               " has five or more nines and nobody is playing solo.\n\n".
+               " To redeal either start a new game or, in case the game was part of a tournament, \n".
+               " go to the last game and use the link at the bottom of the page to redeal.";
              
              $userids = DB_get_all_userid_by_gameid($gameid);
              foreach($userids as $user)
@@ -635,7 +644,7 @@ else if(myisset("me"))
          foreach($userids as $user)
            {
              /* userids are sorted by position... 
-              * so output whatever the firstone has, then whatever the next one has
+              * so output whatever the first one has, then whatever the next one has
               * stop when the sickness is the same as the gametype 
               */
              
@@ -1132,7 +1141,7 @@ else if(myisset("me"))
              else if(ereg("trumpless",$GT))
                echo "<img src=\"pics/button/notrumpsolo_button.png\" class=\"button\" alt=\"$GT\" />";
              else if(ereg("trump",$GT))
-               echo "<img src=\"pics/button/diamandsolo_button.png\" class=\"button\" alt=\"$GT\" />";
+               echo "<img src=\"pics/button/trumpsolo_button.png\" class=\"button\" alt=\"$GT\" />";
            }
 
          /* add point calls */
@@ -1370,6 +1379,30 @@ else if(myisset("me"))
                        }
                    }
                }
+
+             /* if sequence == 4, set winner of the trick, count points and set the next player */
+             if($sequence==4)
+               {
+                 $play   = DB_get_cards_by_trick($trickid);
+                 $winner = get_winner($play,$gametype); /* returns the position */
+
+                 if($winner>0)
+                   mysql_query("UPDATE Trick SET winner='$winner' WHERE id='$trickid'");
+                 else
+                   echo "ERROR during scoring";
+
+                 if($debug)
+                   echo "DEBUG: position $winner won the trick <br />";
+
+                 /* who is the next player? */
+                 $next = $winner;
+               }
+             else
+               {
+                 $next = DB_get_pos_by_hash($me)+1;
+               }
+             if($next==5) $next=1;
+
              
              /* check for coment */
              if(myisset("comment"))
@@ -1404,40 +1437,45 @@ else if(myisset("me"))
                  $done=0;
              
              if($done)
+               DB_set_game_status_by_gameid($gameid,"gameover");
+
+             /* email next player, if game is still running */
+             if(DB_get_game_status_by_gameid($gameid)=='play')
+               {
+                 $next_hash = DB_get_hash_from_game_and_pos($gameid,$next);
+                 $email     = DB_get_email_by_hash($next_hash);
+                 $who       = DB_get_userid_by_email($email);
+                 DB_set_player_by_gameid($gameid,$who);
+                 
+                 $message = "A card has been played in game $gameid.\n\n".
+                   "It's your turn  now.\n".
+                   "Use this link to play a card: ".$host."?me=".$next_hash."\n\n" ;
+                 mymail($email,$EmailName."a card has been played in game $gameid",$message);
+               }
+             else /* send out final email */
                {
-                 DB_set_game_status_by_gameid($gameid,"gameover");
-                 /* get score for last trick 
-                  * all other tricks are handled a few lines further down*/
-                 $play   = DB_get_cards_by_trick($trickid);
-                 $winner = get_winner($play,$gametype); /* returns the position */
-                 /* get points of last trick and save it */
-                 $points = 0;
-                 foreach($play as $card)
-                   $points = $points + card_value($card["card"]);
-                 $winnerid = DB_get_handid_by_gameid_and_position($gameid,$winner);
-                 if($winnerid>0)
-                   mysql_query("INSERT INTO Score VALUES (NULL, '$gameid', '$winnerid', '$points')");
-                 else
-                   {
-                     myerror("ERROR during scoring");
-                   }             
-                 /* email all players */
                  /* individual score */
-                 $result = mysql_query("SELECT fullname, IFNULL(SUM(score),0), Hand.party FROM Hand".
-                                       " LEFT JOIN Score ON Hand.id=Score.hand_id".
-                                       " LEFT JOIN User ON Hand.user_id=User.id".
-                                       " WHERE Hand.game_id=$gameid".
-                                       " GROUP BY fullname" );
+                 $result = mysql_query("SELECT User.fullname, IFNULL(SUM(Card.points),0), Hand.party FROM Hand".
+                               " LEFT JOIN Trick ON Trick.winner=Hand.position AND Trick.game_id=Hand.game_id".
+                               " LEFT JOIN User ON User.id=Hand.user_id".
+                               " LEFT JOIN Play ON Trick.id=Play.trick_id".
+                               " LEFT JOIN Hand_Card ON Hand_Card.id=Play.hand_card_id".
+                               " LEFT JOIN Card ON Card.id=Hand_Card.card_id".
+                               " WHERE Hand.game_id='$gameid'".
+                               " GROUP BY User.fullname" );
                  $message  = "The game is over. Thanks for playing :)\n";
                  $message .= "Final score:\n";
                  while( $r = mysql_fetch_array($result,MYSQL_NUM))
                    $message .= "   ".$r[0]."(".$r[2].") ".$r[1]."\n";
 
-                 $result = mysql_query("SELECT Hand.party, IFNULL(SUM(score),0) FROM Hand".
-                                       " LEFT JOIN Score ON Hand.id=Score.hand_id".
-                                       " LEFT JOIN User ON Hand.user_id=User.id".
-                                       " WHERE Hand.game_id=$gameid".
-                                       " GROUP BY Hand.party" );
+                 $result = mysql_query("SELECT  Hand.party, IFNULL(SUM(Card.points),0) FROM Hand".
+                               " LEFT JOIN Trick ON Trick.winner=Hand.position AND Trick.game_id=Hand.game_id".
+                               " LEFT JOIN User ON User.id=Hand.user_id".
+                               " LEFT JOIN Play ON Trick.id=Play.trick_id".
+                               " LEFT JOIN Hand_Card ON Hand_Card.id=Play.hand_card_id".
+                               " LEFT JOIN Card ON Card.id=Hand_Card.card_id".
+                               " WHERE Hand.game_id='$gameid'".
+                               " GROUP BY User.fullname" );
                  $message .= "\nTotals:\n";
                  while( $r = mysql_fetch_array($result,MYSQL_NUM))
                    $message .= "    ".$r[0]." ".$r[1]."\n";
@@ -1461,52 +1499,6 @@ else if(myisset("me"))
                      mymail($To,$EmailName."game over (game $gameid) part 2(2)",$link);
                    }
                }
-             
-             
-             /* email next player */
-             if(DB_get_game_status_by_gameid($gameid)=='play')
-               {
-                 if($sequence==4)
-                   {
-                     $play   = DB_get_cards_by_trick($trickid);
-                     $winner = get_winner($play,$gametype); /* returns the position */
-                     
-                     /* get points of last trick and save it, last trick is handled 
-                      * a few lines further up  */
-                     $points = 0;
-                     foreach($play as $card)
-                       $points = $points + card_value($card["card"]);
-                     
-                     $winnerid = DB_get_handid_by_gameid_and_position($gameid,$winner);
-                     if($winnerid>0)
-                       mysql_query("INSERT INTO Score VALUES (NULL, '$gameid', '$winnerid', '$points')");
-                     else
-                       {
-                         myerror("ERROR during scoring");
-                       };
-                     if($debug)
-                       echo "DEBUG: $winner got $points <br />";
-                     
-                     /* who is the next player? */
-                     $next = $winner;
-                   }
-                 else
-                   {
-                     $next = DB_get_pos_by_hash($me)+1;
-                   }
-                 if($next==5) $next=1;
-                 
-                 /* email next player */
-                 $next_hash = DB_get_hash_from_game_and_pos($gameid,$next);
-                 $email     = DB_get_email_by_hash($next_hash);
-                 $who       = DB_get_userid_by_email($email);
-                 DB_set_player_by_gameid($gameid,$who);
-
-                 $message = "A card has been played in game $gameid.\n\n".
-                   "It's your turn  now.\n".
-                   "Use this link to play a card: ".$host."?me=".$next_hash."\n\n" ;
-                 mymail($email,$EmailName."a card has been played in game $gameid",$message);            
-               }
            }
          else
            {
@@ -1611,21 +1603,28 @@ else if(myisset("me"))
        {
          echo "the game is over now...<br />\n";
          
-         $result = mysql_query("SELECT fullname, IFNULL(SUM(score),0), Hand.party FROM Hand".
-                               " LEFT JOIN Score ON Hand.id=Score.hand_id".
-                               " LEFT JOIN User ON Hand.user_id=User.id".
-                               " WHERE Hand.game_id=$gameid".
-                               " GROUP BY fullname" );
+         $result = mysql_query("SELECT User.fullname, IFNULL(SUM(Card.points),0), Hand.party FROM Hand".
+                               " LEFT JOIN Trick ON Trick.winner=Hand.position AND Trick.game_id=Hand.game_id".
+                               " LEFT JOIN User ON User.id=Hand.user_id".
+                               " LEFT JOIN Play ON Trick.id=Play.trick_id".
+                               " LEFT JOIN Hand_Card ON Hand_Card.id=Play.hand_card_id".
+                               " LEFT JOIN Card ON Card.id=Hand_Card.card_id".
+                               " WHERE Hand.game_id='$gameid'".
+                               " GROUP BY User.fullname" );
          echo "Final Score:<br />\n".
            " <table>\n";;
          while( $r = mysql_fetch_array($result,MYSQL_NUM))
            echo "  <tr><td>  ".$r[0]."</td><td>(".$r[2].")</td><td> ".$r[1]."</td></tr>";
          echo "</table>\n";
 
-         $result = mysql_query("SELECT Hand.party, IFNULL(SUM(score),0) FROM Hand".
-                               " LEFT JOIN Score ON Hand.id=Score.hand_id".
-                               " LEFT JOIN User ON Hand.user_id=User.id".
-                               " WHERE Hand.game_id=$gameid".
+
+         $result = mysql_query("SELECT Hand.party, IFNULL(SUM(Card.points),0) FROM Hand".
+                               " LEFT JOIN Trick ON Trick.winner=Hand.position AND Trick.game_id=Hand.game_id".
+                               " LEFT JOIN User ON User.id=Hand.user_id".
+                               " LEFT JOIN Play ON Trick.id=Play.trick_id".
+                               " LEFT JOIN Hand_Card ON Hand_Card.id=Play.hand_card_id".
+                               " LEFT JOIN Card ON Card.id=Hand_Card.card_id".
+                               " WHERE Hand.game_id='$gameid'".
                                " GROUP BY Hand.party" );
          echo "Totals:<br />\n".
            " <table> \n";
@@ -1644,9 +1643,14 @@ else if(myisset("me"))
          
          if(!$session || $gameid==$r[0])
            {
-             /* suggest a new game with the same people in it, just rotated once */
+             /* suggest a new game with the same people in it, just rotated once (unless last game was solo) */
              $names = DB_get_all_names_by_gameid($gameid);
-             output_ask_for_new_game($names[1],$names[2],$names[3],$names[0],$gameid);
+             $type  = DB_get_gametype_by_gameid($gameid);
+             
+             if($type=="solo")
+               output_ask_for_new_game($names[0],$names[1],$names[2],$names[3],$gameid);
+             else
+               output_ask_for_new_game($names[1],$names[2],$names[3],$names[0],$gameid);
            }
        }
       break;