NEW FEATURE+BUGFIX: changed calling re/contra
[e-DoKo.git] / functions.php
index deadf34fdb03ea93fc61637ee4f1298bfea85b05..af34345f6303a053c4f5705776a60097860d3c6a 100644 (file)
@@ -309,7 +309,7 @@ function  create_array_of_random_numbers($useridA,$useridB,$useridC,$useridD)
       /* check if we can find a game were non of the player was involved and return 
        * cards insted 
        */
-      $userstr = implode(",",array($useridA,$useridB,$useridC,$useridD));
+      $userstr = "'".implode("','",array($useridA,$useridB,$useridC,$useridD))."'";
       $randomnumbers = DB_get_unused_randomnumbers($userstr);
       $randomnumbers = explode(":",$randomnumbers);
       
@@ -320,15 +320,19 @@ function  create_array_of_random_numbers($useridA,$useridB,$useridC,$useridD)
       for($i=0;$i<48;$i++)
        $r[$i]=$i+1;
       
-      shuffle($r); 
+      /* shuffle using a better random generator than the standard one */
+      for ($i = 0; $i <48; $i++)
+       {
+         $j = @mt_rand(0, $i);
+         $tmp = $r[$i];
+         $r[$i] = $r[$j];
+         $r[$j] = $tmp;
+       }
     };
 
   return $r;
 }
 
-
-
-
 function display_cards($me,$myturn)
 {
   return;
@@ -522,10 +526,16 @@ function can_call($what,$hash)
 {
   global $RULES;
 
-  /*TODO: check if this already has been call by teammate */
-  
   $gameid   = DB_get_gameid_by_hash($hash);
   $gametype = DB_get_gametype_by_gameid($gameid);
+  $oldcall  = DB_get_call_by_hash($hash);
+  $pcall    = DB_get_partner_call_by_hash($hash);
+
+  if( ($pcall!=NULL && $what >= $pcall) || 
+      ($oldcall!=NULL && $what >=$oldcall) )
+    {
+      return 0;
+    }
 
   $NRcards  = count(DB_get_hand($hash));
   
@@ -556,8 +566,40 @@ function can_call($what,$hash)
        return 1;
       break;
     case "9-cards":
-      if( ($what/10) <= $NRcards + $offset)
-       return 1;
+      
+      if($oldcall!=NULL && $pcall!=NULL)
+       $mincall = ($oldcall>$pcall) ? $pcall : $oldcall;
+      else if($oldcall!=NULL)
+       $mincall = $oldcall;
+      else if ($pcall!=NULL)
+       $mincall = $pcall;
+      else
+       $mincall = -1;
+
+      if( 12 <= ($NRcards + $offset))
+       {
+         return 1;
+       }
+      else if ( 9 <= ($NRcards + $offset))
+       {
+         if( ($mincall>=0 && $mincall==120) )
+           return 1;
+       }
+      else if ( 6 <= ($NRcards + $offset))
+       {
+         if( ($mincall>=0 && $mincall<=90 && $what<=60 ) )
+           return 1;
+       }
+      else if ( 3 <= ($NRcards + $offset))
+       {
+         if( ($mincall>=0 && $mincall<=60 && $what<=30 ) )
+           return 1;
+       }
+      else if ( 0 <= ($NRcards + $offset))
+       {
+         if( ($mincall>=0 && $mincall<=30 && $what==0 ) )
+           return 1;
+       };
       break;
     }