BUGFIX: forgot to initialize a variable
[e-DoKo.git] / include / game.php
index dcc08c36f34dc835379116c7b4cdf63d5f06dce3..bbaa5b3500a2e945c5d4a2b113806b0cdb4f2d40 100644 (file)
@@ -57,18 +57,46 @@ if($gametype=="solo")
     $GT  = $gametype." ".$GT;
   }
 
-/* does anyone have both foxes */
-$GAME["schweinchen"]=0;
-for($i=1;$i<5;$i++)
+/* do we need to worry about Schweinchen?
+ * check gametype and rules
+ * if yes, figure out if someone actually has Schweinchen
+ * save information in $GAME
+ */
+$ok=0;
+if( $gamestatus == 'pre' )
   {
-    $hash  = DB_get_hash_from_game_and_pos($gameid,$i);
-    $cards = DB_get_all_hand($hash);
-    if( in_array("19",$cards) && in_array("20",$cards) )
-      {
-       $GAME["schweinchen"]=1;
-       $GAME["schweinchen-who"]=$hash;
-      }
-  };
+    /* always need to use Schweinchen to figure out for example who has poverty */
+    $ok=1;
+  }
+else
+  {
+    /* in a game Schweinchen is not valid in all types of games */
+    if( $gametype == 'normal' || $gametype == 'silent' || $gametype=='trump' )
+      if( in_array($RULES['schweinchen'],array('both','second','secondaftercall')) )
+       $ok=1;
+  }
+
+if($ok)
+{
+  /* need to check for Schweinchen */
+  for($i=1;$i<5;$i++)
+    {
+      $hash  = DB_get_hash_from_game_and_pos($gameid,$i);
+      $cards = DB_get_all_hand($hash);
+      if( in_array("19",$cards) && in_array("20",$cards) )
+       $GAME['schweinchen-who']=$hash;
+    };
+  $GAME['schweinchen-first']  = 0; /* to keep track if they have been played already */
+  $GAME['schweinchen-second'] = 0;
+}
+else
+{
+  /* no need to check for Schweinchen */
+  $GAME['schweinchen-who']=NULL;
+}
+/* end check for Schweinchen */
+
+set_gametype($gametype); /* this sets the $CARDS variable */
 
 /* put everyting in a form */
 echo "<form action=\"index.php?action=game&me=$me\" method=\"post\">\n";
@@ -185,7 +213,7 @@ switch($mystatus)
   case 'init':
     /* here we ask the player if he is sick */
     $mycards = DB_get_hand($me);
-    sort($mycards);
+    $mycards = mysort($mycards,$gametype);
 
     /* output sickness of other playes, in case the already selected and are sitting in front of the current player */
     echo "\n<ul class=\"tricks\">\n";
@@ -307,7 +335,7 @@ switch($mystatus)
     if($mystatus=='check')
       {
        $mycards = DB_get_hand($me);
-       sort($mycards);
+       $mycards = mysort($mycards,$gametype);
 
        /* output sickness of other playes, in case the already selected and are sitting in front of the current player */
        echo "\n<ul class=\"tricks\">\n";
@@ -530,6 +558,25 @@ switch($mystatus)
                  DB_set_hand_status_by_hash($userhash,'poverty');
              }
          }
+       /* check for silent solo, set game type to solo in this case */
+       $gametype = DB_get_gametype_by_gameid($gameid);
+       $userids  = DB_get_all_userid_by_gameid($gameid);
+       foreach($userids as $userid)
+         {
+           $userhash = DB_get_hash_from_gameid_and_userid($gameid,$userid);
+
+           if($gametype=='normal')
+             {
+               $userhand = DB_get_all_hand($userhash);
+               if(check_wedding($userhand))
+                 {
+                   /* normal game type and player has both queens -> silent solo */
+                   /* keep startplayer, just set gametype to silent solo */
+                   DB_set_gametype_by_gameid($gameid,"solo");
+                   DB_set_solo_by_gameid($gameid,'silent');
+                 }
+             }
+         }
 
        /* send out email to first player or poverty person*/
        if($gametype!="poverty" && $gametype!="dpoverty")
@@ -840,7 +887,7 @@ switch($mystatus)
 
     /* check if all players are ready to play,
      * if so, send out email to the startplayer
-     * only need to do this if the game hasn't started yet 
+     * only need to do this if the game hasn't started yet
      */
     $gamestatus = DB_get_game_status_by_gameid($gameid);
     if($gamestatus == 'pre')
@@ -860,14 +907,14 @@ switch($mystatus)
          {
            /* only set this after all poverty, etc. are handled*/
            DB_set_game_status_by_gameid($gameid,'play');
-           
+
            /* email startplayer */
            $startplayer = DB_get_startplayer_by_gameid($gameid);
            $email       = DB_get_email('position-gameid',$startplayer,$gameid);
            $hash        = DB_get_hash_from_game_and_pos($gameid,$startplayer);
            $who         = DB_get_userid('email',$email);
            DB_set_player_by_gameid($gameid,$who);
-           
+
            if($hash!=$me && DB_get_email_pref_by_hash($hash)!="emailaddict")
              {
                /* email startplayer) */
@@ -888,7 +935,10 @@ switch($mystatus)
     if($gametype=="solo")
       {
        $gametype = DB_get_solo_by_gameid($gameid);
-       $GT       = $gametype." ".$GT;
+       if($gametype=='silent')
+         $GT = 'normal';
+       else
+         $GT = $gametype." ".$GT;
       }
     else
       $gametype = "normal";
@@ -972,7 +1022,7 @@ switch($mystatus)
 
     /* output vorbehalte */
     $mygametype =  DB_get_gametype_by_gameid($gameid);
-    if($mygametype != "normal") /* only show when needed */
+    if($mygametype != 'normal' && $mygametype != 'silent') /* only show when needed */
       {
        echo "  <li onclick=\"hl('0');\" class=\"current\"><a href=\"#\">Pre</a>\n".
          "    <div class=\"trick\" id=\"trick0\">\n";
@@ -1004,8 +1054,11 @@ switch($mystatus)
        $user    = $r[6];
 
        /* check if first schweinchen has been played */
-       if( $GAME["schweinchen"] && ($r[0] == 19 || $r[0] == 20) )
-         $GAME["schweinchen"]++;
+       if( $GAME['schweinchen-who'] && ($r[0] == 19 || $r[0] == 20) )
+         if(!$GAME['schweinchen-first'])
+           $GAME['schweinchen-first'] = 1; /* playing the first fox */
+         else
+           $GAME['schweinchen-second'] = 1; /* this must be the second fox */
 
        /* save card to be able to find the winner of the trick later */
        $play[$seq] = array("card"=>$r[0],"pos"=>$pos);
@@ -1076,6 +1129,7 @@ switch($mystatus)
       {
        $card   = $_REQUEST["card"];
        $handid = DB_get_handid('hash',$me);
+       $commentSchweinchen =""; /* used to add a comment when Schweinchen is being played */
 
        /* check if we have card and that we haven't played it yet*/
        /* set played in hand_card to true where hand_id and card_id*/
@@ -1112,20 +1166,23 @@ switch($mystatus)
 
            $playid = DB_play_card($trickid,$handcardid,$sequence);
 
-           /* check special output for schweinchen in case:
-            * schweinchen is in the rules, a fox has been played and the gametype is correct
+           /* check special output for schweinchen in case in case a fox is being played
+            * check for correct rules, etc. has already been done
             */
-           if( $GAME["schweinchen"] &&
-               ($card == 19 || $card == 20) &&
-               ($gametype == "normal" || $gametype == "silent"|| $gametype=="trump"))
+           if( $GAME["schweinchen-who"] && ($card == 19 || $card == 20) )
              {
-               $GAME["schweinchen"]++; // count how many have been played including this one
-               if($GAME["schweinchen"]==3 && $RULES["schweinchen"]=="second" )
-                 DB_insert_comment("Schweinchen! ",$playid,$myid);
-               if($RULES["schweinchen"]=="both" )
-                 DB_insert_comment("Schweinchen! ",$playid,$myid);
+               if(!$GAME['schweinchen-first'])
+                 $GAME['schweinchen-first'] = 1; /* playing the first fox */
+               else
+                 $GAME['schweinchen-second'] = 1; /* this must be the second fox */
+
+               if( ($GAME['schweinchen-second']==1 && $RULES['schweinchen']=='second') || $RULES['schweinchen']=='both')
+                 {
+                   DB_insert_comment("Schweinchen! ",$playid,$myid);
+                   $commentSchweinchen = "Schweinchen! ";
+                 }
                if ($debug)
-                 echo "schweinchen = ".$GAME["schweinchen"]." ---<br />";
+                 echo "schweinchen = ".$GAME["schweinchen-who"]." ---<br />";
              }
 
            /* if sequence == 4 check who one in case of wedding */
@@ -1178,7 +1235,7 @@ switch($mystatus)
                if(DB_get_gametype_by_gameid($gameid)=="solo")
                  {
                    $solo = DB_get_solo_by_gameid($gameid);
-                   if($solo == "trump" || $solo == "silent")
+                   if($solo == 'trump' || $solo == 'silent')
                      $ok = 1; /* for trump solos and silent solos, foxes are ok */
                  }
                else
@@ -1266,6 +1323,8 @@ switch($mystatus)
                $comment = $_REQUEST["comment"];
                if($comment != "")
                  DB_insert_comment($comment,$playid,$myid);
+               if($commentSchweinchen)
+                 $comment = $commentSchweinchen . $comment;
              };
 
            /* check for note */
@@ -1666,7 +1725,10 @@ switch($mystatus)
 
          foreach($mycards as $card)
            {
-             if($followsuit && !same_type($card,$firstcard))
+             if( ($followsuit && !same_type($card,$firstcard)) ||
+                 ( (int)($card)==19 && ($RULES['schweinchen']=='second'||$RULES['schweinchen']=='secondaftercall')
+                   && $GAME['schweinchen-who']==$me && !$GAME['schweinchen-first'] )
+                 )
                display_card($card,$PREF["cardset"]);
              else
                display_link_card($card,$PREF["cardset"]);
@@ -1819,8 +1881,15 @@ switch($mystatus)
            $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
+             {
+               $solo = DB_get_solo_by_gameid($gameid);
+
+               if($solo!='silent') /* repeat game with same first player */
+                 output_ask_for_new_game($names[0],$names[1],$names[2],$names[3],$gameid);
+               else /* rotate normally */
+                 output_ask_for_new_game($names[1],$names[2],$names[3],$names[0],$gameid);
+             }
+           else /* rotate normally */
              output_ask_for_new_game($names[1],$names[2],$names[3],$names[0],$gameid);
          }
       }