new points history management (1' part)
authorMatteo Nastasi (mop) <nastasi@alternativeoutput.it>
Mon, 9 Sep 2013 17:30:56 +0000 (19:30 +0200)
committerMatteo Nastasi (mop) <nastasi@alternativeoutput.it>
Mon, 9 Sep 2013 17:30:56 +0000 (19:30 +0200)
TODO.txt
bin/tagger.sh
sql/sql.d/054-continue-match.sql
web/Obj/dbase_file.phh
web/Obj/dbase_pgsql.phh
web/briskin5/Obj/briskin5.phh
web/briskin5/index_wr.php

index a9a6090..b6f9053 100644 (file)
--- a/TODO.txt
+++ b/TODO.txt
@@ -6,6 +6,7 @@
    - CONTINUE FEATURE
      . save points every game
      . modify points calculation to include order and mazzo
+     . exclude not standard types from statistics
 
      . add command to continue
 
index b272a98..a0b93e0 100755 (executable)
@@ -1,2 +1,3 @@
 #!/bin/bash
-etags -l php $(find -name '*.ph*')
\ No newline at end of file
+etags -l php $(find -name '*.ph*')
+
index 4ffb5b4..2aefdca 100644 (file)
@@ -5,6 +5,12 @@ CREATE TABLE #PFX#bin5_table_order (
        pos    integer
        );
 
-ALTER TABLE #PFX#bin5_matches ADD COLUMN mult_next  integer DEFAULT 1;   -- current multiplier
-ALTER TABLE #PFX#bin5_matches ADD COLUMN mazzo_next integer;             -- current card shaker
+ALTER TABLE #PFX#bin5_matches ADD COLUMN mult_next  integer DEFAULT -1;  -- next multiplier
+ALTER TABLE #PFX#bin5_matches ADD COLUMN mazzo_next integer DEFAULT -1;  -- next card shaker
        
+ALTER TABLE #PFX#bin5_games ADD COLUMN asta_pnt     integer DEFAULT -1;  -- curr bet points
+ALTER TABLE #PFX#bin5_games ADD COLUMN pnt          integer DEFAULT -1;  -- curr points made
+ALTER TABLE #PFX#bin5_games ADD COLUMN asta_win     integer DEFAULT -1;  -- curr caller id
+ALTER TABLE #PFX#bin5_games ADD COLUMN friend       integer DEFAULT -1;  -- curr callee id
+ALTER TABLE #PFX#bin5_games ADD COLUMN mazzo        integer DEFAULT -1;  -- curr card shaker
+ALTER TABLE #PFX#bin5_games ADD COLUMN mult         integer DEFAULT -1;  -- curr multiplier
index de0e3c2..9bf634a 100644 (file)
@@ -178,7 +178,7 @@ class BriskDB {
         return ($ret);
     }
 
-    function bin5_points_save($date, $table, $tidx, $codes, $pts)
+    function bin5_points_save($date, $table, $tidx, $ucodes, $pts)
     {
         return TRUE;
     }
index c8fd026..327a893 100644 (file)
@@ -3,7 +3,7 @@
    *  brisk - dbase_pgsql.phh
    *
    *  Copyright (C) 2006-2012 Matteo Nastasi
-   *                          mailto: nastasi@alternativeoutput.it 
+   *                          mailto: nastasi@alternativeoutput.it
    *                                  matteo.nastasi@milug.org
    *                          web: http://www.alternativeoutput.it
    *
@@ -34,20 +34,20 @@ function escsql($s)
     return str_replace($escsql_from, $escsql_to, $s);
 }
 
-class DBConn 
+class DBConn
 {
     static $dbcnnx = FALSE;
     var $db = FALSE;
-    
+
     function DBConn()
     {
-        $this->db = DBConn::$dbcnnx;        
+        $this->db = DBConn::$dbcnnx;
     }
 
     static function create()
     {
         GLOBAL $G_dbauth;
-        
+
         if (DBConn::$dbcnnx == FALSE) {
             if (!(DBConn::$dbcnnx = @pg_connect ($G_dbauth, PGSQL_CONNECT_FORCE_NEW))) {
                 return (FALSE);
@@ -85,7 +85,7 @@ class BriskDB
     var $dbconn;
     var $item;
     var $item_n;
-    
+
     function BriskDB($dbconn)
     {
         $this->dbconn = $dbconn;
@@ -98,15 +98,15 @@ class BriskDB
         $ret = FALSE;
 
         log_main("BriskDB create:start");
-        
+
         do {
             if (($dbconn = DBConn::create()) == FALSE) {
                 break;
             }
-            
+
             $ret = new BriskDB($dbconn);
         } while (0);
-        
+
         return ($ret);
     }
 
@@ -125,20 +125,20 @@ class BriskDB
     function users_load()
     {
     }
-    
+
     function login_exists($login)
     {
         GLOBAL $G_dbpfx;
 
         /* check the existence of the nick in the BriskDB */
         log_main("login_exists: ".$login);
-        
+
         $user_sql = sprintf("SELECT * FROM %susers WHERE login = lower('%s') AND (type & CAST (X'%08x' as integer)) = 0;",
                             $G_dbpfx, escsql($login), USER_FLAG_TY_DISABLE);
         if (($user_pg = $this->query($user_sql)) != FALSE)
             if (pg_numrows($user_pg) == 1)
                 return TRUE;
-        
+
         return FALSE;
     }
 
@@ -151,7 +151,7 @@ class BriskDB
         }
         if (pg_numrows($user_pg) != 1)
             return FALSE;
-        
+
         $user_obj = pg_fetch_object($user_pg, 0);
 
         return ($user_obj);
@@ -187,37 +187,39 @@ class BriskDB
 
         return TRUE;
     }
-    
+
+    /*
+      if success return a LoginDBItem object
+     */
     function login_verify($login, $pass)
     {
         GLOBAL $G_dbpfx;
-        
+
         $ret = FALSE;
-        
+
         log_main("login_verify: ".$login);
-        
-        
+
         //O /* check the existence of the nick in the BriskDB */
         //O for ($i = 0 ; $i < $this->item_n ; $i++) {
         //O log_main("login_verify: BEGIN");
-        
+
         if (($user_obj = $this->getrecord_bylogin($login)) == FALSE) {
             return FALSE;
         }
 
         log_main("login[".$user_obj->code."]: ".$user_obj->login);
-        
+
         /* if it exists check for a valid challenge */
-        if (($a_sem = Challenges::lock_data(TRUE)) != FALSE) { 
+        if (($a_sem = Challenges::lock_data(TRUE)) != FALSE) {
             if (($chals = &Challenges::load_data()) != FALSE) {
                 for ($e = 0 ; $e < $chals->item_n ; $e++) {
                     log_main("challenge[".$e."]: ".$chals->item[$e]->login);
                     if (strcmp($login, $chals->item[$e]->login) == 0) {
                         log_main("login_verify [".$pass."] with [".md5($chals->item[$e]->token.$user_obj->pass)."]");
-                        
+
                         if (strcmp($pass, md5($chals->item[$e]->token.$user_obj->pass)) == 0) {
                             log_main("login_verify SUCCESS for ".$login);
-                            
+
                             $chals->rem($login);
                             $this->user_update_login_time($user_obj->code, time());
                             $ret = LoginDBItem::LoginDBItemFromRecord($user_obj);
@@ -226,33 +228,33 @@ class BriskDB
                     }
                 } // end for ($e = 0 ...
             }
-            
+
             if ($chals->ismod()) {
                 Challenges::save_data(&$chals);
             }
-            
+
             Challenges::unlock_data($a_sem);
         }
         //O break;
         // O } //  if (strcasecmp($this->item[$i]->login, ...
         //O }
-    
+
         return ($ret);
     }
 
     function getitem_bylogin($login, &$id) {
         $ret = FALSE;
         $id = -1;
-        
+
         log_main("getitem_bylogin: ".$login);
-        
+
         if (($user_obj = $this->getrecord_bylogin($login)) == FALSE)
             return $ret;
 
         $id = $user_obj->code;
         return (LoginDBItem::LoginDBItemFromRecord($user_obj));
     }
-    
+
     // TODO FOR DB
     function getmail($login)
     {
@@ -260,7 +262,7 @@ class BriskDB
 
         if (($ret = $this->getrecord_bylogin($login)) == FALSE)
             return FALSE;
-        
+
         return ($ret->email);
     }
 
@@ -271,7 +273,7 @@ class BriskDB
         for ($i = 0 ; $i < $olddb->count() ; $i++) {
             $user_sql = sprintf("INSERT INTO %susers ( login, pass, email, type) VALUES ('%s', '%s', '%s', %d);",
                                 $G_dbpfx, escsql(strtolower($olddb->item[$i]->login)), escsql($olddb->item[$i]->pass),
-                                escsql($olddb->item[$i]->email), $olddb->item[$i]->type & USER_FLAG_TY_ALL); 
+                                escsql($olddb->item[$i]->email), $olddb->item[$i]->type & USER_FLAG_TY_ALL);
 
             if ( ! (($user_pg  = $this->query($user_sql)) != FALSE && pg_affected_rows($user_pg) == 1) ) {
                 $cont .= sprintf("ERROR IN LINE: %s\n", eschtml($user_sql));
@@ -287,8 +289,8 @@ class BriskDB
         return ($this->dbconn);
     }
 
-    //   ttok   text UNIQUE,      
-    //   tidx   
+    //   ttok   text UNIQUE,
+    //   tidx
     function bin5_points_save($date, $table, $tidx, $ucodes, $pts)
     {
         GLOBAL $G_dbpfx;
@@ -300,7 +302,7 @@ class BriskDB
         $n = count($ucodes);
         /* check the existence of the nick in the BriskDB */
         log_main("bin5_points_save: ");
-        
+
         do {
             if ($this->query("BEGIN") == FALSE) {
                 break;
@@ -336,14 +338,17 @@ class BriskDB
             /*
              * games management
              */
-            $gam_sql = sprintf("INSERT INTO %sbin5_games (mcode, tstamp) 
-                                               VALUES (%d, to_timestamp(%d)) RETURNING *;",
-                               $G_dbpfx, $mtc_obj->code, $date);
+            $gam_sql = sprintf("INSERT INTO %sbin5_games (mcode, tstamp, asta_pnt, pnt, asta_win, friend, mazzo, mult)
+                                               VALUES (%d, to_timestamp(%d), %d, %d, %d, %d, %d, %d) RETURNING *;",
+                               $G_dbpfx, $mtc_obj->code, $date,
+                               ($table->old_asta_win == -1 ? -1 : $ucodes[$table->old_asta_win]),
+                               ($table->old_friend == -1 ? -1 : $ucodes[$table->old_friend]),
+                               $table->old_asta_pnt, $table->old_mult, $table->old_pnt);
             if (($gam_pg  = $this->query($gam_sql)) == FALSE || pg_affected_rows($gam_pg) != 1) {
                 log_crit(sprintf("bin5_points_save: failed at insert game [%s]", $gam_sql));
                 break;
             }
-        
+
             $gam_obj = pg_fetch_object($gam_pg,0);
 
             /*
@@ -351,7 +356,7 @@ class BriskDB
              */
             for ($i = 0 ; $i < $n ; $i++) {
                 /* put points */
-                $pts_sql = sprintf("INSERT INTO %sbin5_points (gcode, ucode, pts) 
+                $pts_sql = sprintf("INSERT INTO %sbin5_points (gcode, ucode, pts)
                                                VALUES (%d, %d, %d);",
                                    $G_dbpfx, $gam_obj->code, $ucodes[$i], $pts[$i]);
                 if (($pts_pg  = $this->query($pts_sql)) == FALSE || pg_affected_rows($pts_pg) != 1) {
@@ -361,25 +366,25 @@ class BriskDB
             }
             if ($i < $n)
                 break;
-            
+
             if ($this->query("COMMIT") == FALSE) {
                 break;
             }
-             
+
             $is_trans = FALSE;
 
             $ret =  TRUE;
         } while (0);
-        
+
         if ($is_trans)
             $this->query("ROLLBACK");
-        
+
         return $ret;
     }
 
 } // End class BriskDB
 
-class LoginDBOld 
+class LoginDBOld
 {
     var $item;
     var $item_n;
index ea2ee6e..e10cf82 100644 (file)
@@ -3,7 +3,7 @@
  *  brisk - briskin5.phh
  *
  *  Copyright (C) 2006-2012 Matteo Nastasi
- *                          mailto: nastasi@alternativeoutput.it 
+ *                          mailto: nastasi@alternativeoutput.it
  *                                  matteo.nastasi@milug.org
  *                          web: http://www.alternativeoutput.it
  *
@@ -29,7 +29,11 @@ define('BIN5_SHM_MAX', (BIN5_SHM_MIN + 1048576));
 define('BIN5_SHM_DLT', 32768);
 define('BIN5_PROXY_PATH', PROXY_PATH."/bin5");
 
-$mlang_bin5_bin5 = array( 
+define('BIN5_RULES_FINISH',  0);
+define('BIN5_RULES_ABANDON', 1);
+define('BIN5_RULES_ALLPASS', 2);
+
+$mlang_bin5_bin5 = array(
                          'info_part' => array( 'it' => '<hr>Nell\'ultima mano ha chiamato <b>%s</b>, il socio era <b>%s</b>,<br>',
                                                'en' => '<hr>In the last hand the declarer was <b>%s</b>, the partner was <b>%s</b>,<br>'),
                          'info_capp' => array( 'it' => 'hanno fatto <b>cappotto</b> EBBRAVI!.<br>',
@@ -53,7 +57,7 @@ $mlang_bin5_bin5 = array(
                                                'en' => 'he/she had to do <b>%s</b> points and they had made <b>%d</b>: he/she had %s.<br>'),
                          'info_acap' => array( 'it' => 'ha fatto <b>cappotto</b> EBBRAVO!.<hr>',
                                                'en' => 'and he/she made <b>capot</b> WELL DONE!.<hr>'),
-                         
+
                          'info_omul' => array( 'it' => ' La partita valeva <b>%s</b>.',
                                                'en' => ' EN: The game was worth <b>%s</b>.' ),
 
@@ -75,8 +79,6 @@ $mlang_bin5_bin5 = array(
                                                'en' => 'Call%s:'),
                          'call_call' => array( 'it' => 'Chiama %s%s:',
                                                'en' => 'The declarer is %s%s:')
-
-                         
                           );
 
 // MLANG
@@ -148,30 +150,31 @@ class Bin5_table extends Table {
     var $asta_pla_n;
     var $asta_card;
     var $asta_pnt;
-  
+
     var $mult;
     var $points;    // points array
     var $points_n;  // number of row of points
     var $total;
 
-    var $asta_win;
+    var $asta_win;          // the caller idx position at table
     var $briscola;
-    var $friend;
-  
+    var $friend;            // the callee idx position at table
+
+    var $old_mazzo;
     var $old_reason;
     var $old_asta_pnt;
     var $old_mult;
-    var $old_pnt;
-    var $old_asta_win;
-    var $old_friend;
+    var $old_pnt;           // points made by caller and callee
+    var $old_asta_win;      // the old caller idx position at table
+    var $old_friend;        // the old callee idx position at table
 
-    function Bin5_table() 
+    function Bin5_table()
     {
     }
 
 
     /* CREATE() NOT USED
-       function create($idx) 
+       function create($idx)
        {
        if (($thiz =& new Bin5_table()) == FALSE)
        return (FALSE);
@@ -184,7 +187,7 @@ class Bin5_table extends Table {
        $thiz->asta_card =  -1;
        $thiz->asta_pnt  =  -1;
        $thiz->mult      =   0;
-    
+
        $thiz->points    =   array( );
        $thiz->points_n  =   0;
        $thiz->total     =   array( 0, 0, 0, 0, 0);
@@ -209,7 +212,7 @@ class Bin5_table extends Table {
        {
        if (($thiz =& new Bin5_table()) == FALSE)
        return (FALSE);
-    
+
        parent::copy($from);
 
        $thiz->card = $from->card;
@@ -221,16 +224,16 @@ class Bin5_table extends Table {
        $thiz->asta_pla_n = $from->asta_pla_n;
        $thiz->asta_card = $from->asta_card;
        $thiz->asta_pnt = $from->asta_pnt;
-    
+
        $thiz->mult = $from->mult;
        $thiz->points = $from->points;
        $thiz->points_n = $from->points_n;
        $thiz->total = $from->total;
-    
+
        $thiz->asta_win = $from->asta_win;
        $thiz->briscola = $from->briscola;
        $thiz->friend = $from->friend;
-    
+
        $thiz->old_reason = $from->old_reason;
        $thiz->old_asta_pnt = $from->old_asta_pnt;
        $thiz->old_mult = $from->mult;
@@ -251,7 +254,7 @@ class Bin5_table extends Table {
     {
         if (($thiz =& new Bin5_table()) == FALSE)
             return (FALSE);
-    
+
         $thiz->parentcopy($from);
 
         log_main("PLAYER_N - spawn.".$thiz->player_n);
@@ -301,15 +304,15 @@ class Bin5_table extends Table {
     }
 
 
-    //   function bunch_create_old() function AND 
+    //   function bunch_create_old() function AND
     //   {
     //     $ret = array();
-    // 
+    //
     //     for ($i = 0 ; $i < (BIN5_PLAYERS_N == 5 ? 40 : 24) ; $i++) {
     //       // for ($i = 0 ; $i < 40 ; $i++) {
     //       $ret[$i] =& new Card($i, 'bunch', 'no_owner');
     //     }
-    // 
+    //
     //     $oret = &$ret;
     //     return ($oret);
     //   }
@@ -317,7 +320,7 @@ class Bin5_table extends Table {
     function bunch_create()
     {
         $ret = array();
-      
+
         for ($i = 0 ; $i < (BIN5_PLAYERS_N == 5 ? 40 : 24) ; $i++) {
             $this->card[$i] = new Card($i, 'bunch', 'no_owner');
         }
@@ -327,18 +330,18 @@ class Bin5_table extends Table {
     {
         log_main("bunch_make start");
         $ct = array(0,0,0,0,0);
-    
+
         mt_srand(make_seed());
-    
-        for ($i = (BIN5_PLAYERS_N == 5 ? 40 : 24) - 1 ; $i >= 0 ; $i--) 
+
+        for ($i = (BIN5_PLAYERS_N == 5 ? 40 : 24) - 1 ; $i >= 0 ; $i--)
             $rest[$i] = $i;
 
         for ($i = (BIN5_PLAYERS_N == 5 ? 40 : 24) - 1 ; $i >= 0 ; $i--) {
             $rn = rand(0, $i);
-      
+
             if ($rn == 0)
                 log_main("RND ZERO");
-      
+
             $id = $rest[$rn];
 
             $owner = $i % BIN5_PLAYERS_N;
@@ -374,8 +377,7 @@ class Bin5_table extends Table {
 
         $this->gstart = ($this->mazzo+1) % BIN5_PLAYERS_N;
         $this->bunch_make();
-    
-    
+
         $this->asta_pla_n = BIN5_PLAYERS_N;
         $this->asta_card = -1;
         $this->asta_pnt  = 60;
@@ -383,7 +385,7 @@ class Bin5_table extends Table {
         $this->briscola  = -1;
         $this->friend    = -1;
         $this->turn      =  0;
-    
+
         for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
             $this->asta_pla[$i] = TRUE;
             $user_cur = $userarr[$this->player[$i]];
@@ -396,18 +398,19 @@ class Bin5_table extends Table {
         log_rd2("GEND 4");
     }
 
-    function game_next()
+    function game_next($delta)
     {
-        $this->mazzo  = ($this->mazzo + 1) % BIN5_PLAYERS_N;
+        $this->old_mazzo = $this->mazzo;
+        $this->mazzo  = ($this->mazzo + $delta) % BIN5_PLAYERS_N;
     }
 
 
     function hand_points($idx)
     {
-        GLOBAL $G_all_points; 
-    
+        GLOBAL $G_all_points;
+
         $tot = 0;
-    
+
         for ($i = 0 ; $i < (BIN5_PLAYERS_N == 5 ? 40 : 24) ; $i++) {
             // for ($i = 0 ; $i < 40 ; $i++) {
             if ($this->card[$i]->owner != $idx)
@@ -425,7 +428,7 @@ class Bin5_table extends Table {
     {
         $ct = $this->exitlock_calc($userarr, $table_pos);
 
-        $ret = sprintf('exitlock_show(%d, %s);', $ct, 
+        $ret = sprintf('exitlock_show(%d, %s);', $ct,
                        ($userarr[$this->player[$table_pos]]->exitislock ? 'true' : 'false'));
         return ($ret);
     }
@@ -434,13 +437,160 @@ class Bin5_table extends Table {
     {
         $ct = 0;
 
-        for ($i = 0 , $ct = 0 ; $i < PLAYERS_N ; $i++) {       
+        for ($i = 0 , $ct = 0 ; $i < PLAYERS_N ; $i++) {
             if ($userarr[$this->player[$i]]->exitislock == FALSE)
                 $ct++;
         }
 
         return ($ct);
     }
+
+    function rules_engine($bri, $action, $user)
+    {
+        GLOBAL $G_all_points;
+
+        $pts = array();
+
+        if ($action == BIN5_RULES_ALLPASS) { // return TRUE if all correct
+            $this->old_reason = "Hanno passato tutti.";
+            $this->old_pnt = 0;
+            $this->mult += 1;
+            for ($i = 0 ; $i < PLAYERS_N ; $i++) {
+                $pts[$i] = 0;
+            }
+
+            $game_delta = 1;
+            // $this->game_next(1);
+            $this->game_init(&$bri->user);
+        }
+        else if ($action == BIN5_RULES_ABANDON) { // return TRUE if all correct
+            log_wr(sprintf("GIOCO FINITO !!!"));
+
+            $this->old_reason = sprintf("Ha lasciato %s perché aveva al massimo 2 punti.", xcape($user->name));
+            $this->old_pnt = 0;
+            $this->mult += 1;
+
+            for ($i = 0 ; $i < PLAYERS_N ; $i++) {
+                $pts[$i] = 0;
+            }
+
+            // Non si cambia mazzo se si abbandona la partita
+            $game_delta = 0;
+            // $this->game_next(0);
+            $this->game_init(&$bri->user);
+        }
+        else if ($action == BIN5_RULES_FINISH) { // return TRUE if all correct
+            do {
+                $pro = 0;
+
+                if ($this->asta_pnt == 60)
+                    $this->asta_pnt = 61;
+
+                $this->old_reason = "";
+
+                // count points for the temporary 2 teams
+                for ($i = 0 ; $i < (BIN5_PLAYERS_N == 5 ? 40 : 24) ; $i++) {
+                    $ctt = $this->card[$i]->value % 10;
+                    $own = $this->card[$i]->owner;
+                    if ($own == $this->asta_win || $own == $this->friend)
+                        $pro += $G_all_points[$ctt];
+                }
+
+                log_wr(sprintf("PRO: [%d]", $pro));
+
+                // PATTA case !
+                if ($this->asta_pnt == 61 && $pro == 60) {
+                    $this->points[$this->points_n % MAX_POINTS] = array();
+                    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                        $this->points[$this->points_n % MAX_POINTS][$i] = 0;
+                        $pts[$i] = 0;
+                    }
+                    $this->points_n++;
+                    $this->old_pnt = $pro;
+                    $this->mult += 1;
+
+                    // return($pts);
+                    break;
+                }
+
+                if ($pro >= $this->asta_pnt)
+                    $sig = 1;
+                else
+                    $sig = -1;
+
+                $this->points[$this->points_n % MAX_POINTS] = array();
+                for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                    if ($i == $this->asta_win)
+                        $pt = ($i == $this->friend ? 4 : 2);
+                    else if ($i == $this->friend)
+                        $pt = 1;
+                    else
+                        $pt = -1;
+
+                    log_wr(sprintf("PRO: pt[%d][%d] = %d", $this->points_n % MAX_POINTS, $i, $pt));
+
+                    $pt = $pt * $sig * $this->multer(TRUE) * ($pro == 120 ? 2 : 1);
+
+                    log_wr(sprintf("PRO:[%d][%d][%d]", $sig, $this->multer(TRUE), ($pro == 120 ? 2 : 1)));
+
+                    $this->points[$this->points_n % MAX_POINTS][$i] = $pt;
+                    $this->total[$i] += $pt;
+                    $pts[$i] = $pt;
+                }
+                $this->points_n++;
+                $this->old_pnt = $pro;
+                $this->mult = 0;
+
+                // return($pts);
+            } while (0);
+            $game_delta = 1;
+        }
+        else {
+            return (FALSE);
+        }
+        $this->game_next($game_delta);
+
+        $plist = "$this->table_token|$user->table_orig|$this->player_n";
+        $ucodes = array();
+        $codes = "";
+        for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+            $user_cur = &$bri->user[$this->player[$i]];
+
+            /* pro db */
+            $ucodes[$i] = $user_cur->code_get();
+
+            /* pro log */
+            $plist .= '|'.xcapelt($user_cur->name).'|'.$pts[$i];
+            $codes .= '|'.xcapelt($user_cur->code_get());
+        }
+        $plist .= $codes;
+        log_legal($curtime, $user->ip, $user, "STAT:BRISKIN5:FINISH_GAME", $plist);
+
+        $this->old_mazzo = $this->mazzo;
+        $this->old_asta_pnt = $this->asta_pnt;
+        $this->old_mult = $this->mult;
+        // $this->old_pnt and $this->old_reason are specific
+        $this->old_asta_win = $this->asta_win;
+        $this->old_friend = $this->friend;
+
+        if ($user->table_orig < TABLES_AUTH_N) {
+            require_once("../Obj/dbase_".$G_dbasetype.".phh");
+
+            if (($bdb = BriskDB::create()) != FALSE) {
+                $bdb->bin5_points_save($curtime, $this, $user->table_orig, $ucodes, $pts);
+                unset($bdb);
+            }
+            else {
+                log_points($remote_addr, $curtime, $user, "STAT:BRISKIN5:FINISH_GAME", "DATABASE CONNECTION FAILED");
+            }
+            log_points($curtime, $user, "STAT:BRISKIN5:FINISH_GAME", $plist);
+        }
+
+        $this->game_init(&$bri->user);
+
+        return (TRUE);
+    }
+
 } // end class Bin5_table
 
 
@@ -449,60 +599,60 @@ class Bin5_table extends Table {
 define('BIN5_USER_FLAG_RING_ENDAUCT', 0x01);
 
 class Bin5_user extends User {
-    var $asta_card;  // 
+    var $asta_card;  //
     var $asta_pnt;   //
     var $handpt;     // Total card points at the beginning of the current hand.
     var $exitislock; // Player can exit from the table ?
-    var $privflags;  // Flags for briskin5 only 
+    var $privflags;  // Flags for briskin5 only
 
     const BASE = "../";
-    
+
     function User() {
     }
-    
+
     /* CREATE NOT USED
        function create($name, $sess, $stat = "", $subst = "", $table = -1, $ip="0.0.0.0") {
        if (($thiz =& new User()) == FALSE)
        return (FALSE);
-     
+
        $thiz->asta_card = -2;
        $thiz->asta_pnt  = -1;
        $thiz->handpt = -1;
        $thiz->exitislock = TRUE;
        $thiz->privflags = 0;
-     
+
        return ($thiz);
        }
     */
-    
+
     function parentcopy(&$from)
     {
         parent::copy($from);
     }
-    
+
     function copy(&$from)
     {
         $this->parentcopy($from);
-        
+
         $this->asta_card  = $from->asta_card;
         $this->asta_pnt   = $from->asta_pnt;
         $this->handpt     = $from->handpt;
         $this->exitislock = $from->exitislock;
         $this->privflags  = $from->privflags;
     }
-    
+
     /* CLONE NOT USED
        function myclone(&$from)
        {
        if (($thiz =& new User()) == FALSE)
        return (FALSE);
-     
+
        $thiz->copy($from);
-     
+
        return ($thiz);
-       } 
+       }
     */
-    
+
     static function spawn($from, &$bri, $table, $table_pos, $get, $post, $cookie)
     {
         if (($thiz = new Bin5_user()) == FALSE)
@@ -513,8 +663,8 @@ class Bin5_user extends User {
         }
 
         $thiz->parentcopy($from);
-        
-        /* NOTE: at this moment idx and table_pos fields have the same value 
+
+        /* NOTE: at this moment idx and table_pos fields have the same value
            but diffentent functions, we keep them separated for a while */
         $thiz->room       = $bri;
         $thiz->idx        = $table_pos;
@@ -522,32 +672,32 @@ class Bin5_user extends User {
         $thiz->asta_pnt   = -1;
         $thiz->handpt     = -1;
         $thiz->exitislock = TRUE;
-        
+
         log_wr("Bin5 constructor");
-        
+
         $thiz->privflags  = ($CO_bin5_pref_ring_endauct == "true" ? BIN5_USER_FLAG_RING_ENDAUCT : 0) | 0;
 
         $thiz->table_orig = $table;
         $thiz->table      = 0;
         $thiz->table_pos  = $table_pos;
-        
+
         $thiz->step_inc();
 
         return ($thiz);
     }
 
-    function step_set($step) 
+    function step_set($step)
     {
         $this->step = $step & 0x7fffffff;
-        
+
         return TRUE;
     }
-    
+
     function step_inc($delta = 1) {
         $this->step += $delta;
         /* modularization because unpack() not manage unsigned 32bit int correctly */
         $this->step &= 0x7fffffff;
-        
+
         return (TRUE);
     }
 
@@ -557,7 +707,7 @@ class Bin5_user extends User {
         do {
             if (validate_sess($sess) == FALSE)
                 break;
-            
+
             if (file_exists(BIN5_PROXY_PATH."/table".$tab_id) == FALSE)
                 mkdir(BIN5_PROXY_PATH."/table".$tab_id, 0775, TRUE);
             if (($fp = @fopen(BIN5_PROXY_PATH."/table".$tab_id."/".$sess.".step", 'rb')) == FALSE)
@@ -568,20 +718,20 @@ class Bin5_user extends User {
                 break;
             $arr = unpack('Ls/Li', $s);
             fclose($fp);
-            
+
             // log_rd2("A0: ".$arr[0]."  A1: ".$arr[1]);
             return ($arr);
         } while (0);
-        
+
         if ($fp != FALSE)
             fclose($fp);
-        
+
         log_rd2("STEP_GET [".$sess."]: return false ");
-        
+
         return (FALSE);
     }
 
-    function save_step() 
+    function save_step()
     {
         do {
             if (validate_sess($this->sess) == FALSE)
@@ -592,15 +742,15 @@ class Bin5_user extends User {
                 break;
             fwrite($fp, pack("LL",$this->step, $this->idx));
             fclose($fp);
-            
-            log_main("step_set [".$this->sess. "] [".$this->step."]"); 
-            
+
+            log_main("step_set [".$this->sess. "] [".$this->step."]");
+
             return (TRUE);
         } while (0);
-        
+
         return (FALSE);
     }
-    
+
     static function unproxy_step($tab_id, $sess)
     {
         log_rd2("UNPROXY: ".BIN5_PROXY_PATH."/table".$tab_id."/".$sess.".step");
@@ -609,15 +759,15 @@ class Bin5_user extends User {
 
         @unlink(BIN5_PROXY_PATH."/table".$tab_id."/".$sess.".step");
     }
-    
-    function destroy_data($tab_id) 
+
+    function destroy_data($tab_id)
     {
         do {
             if (($tok = @ftok(FTOK_PATH."/bin5/table".$tab_id."/user".$this->table_pos, "B")) == -1) {
                 log_crit("BIN5 USER DATA REMOVE FAILED 1 [".FTOK_PATH."/bin5/table".$tab_id."/user".$this->table_pos."]");
                 break;
             }
-          
+
             if (($shm = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
                 log_crit("BIN5 USER DATA REMOVE FAILED 2");
                 break;
@@ -629,14 +779,14 @@ class Bin5_user extends User {
             $shm = FALSE;
 
             log_main("BIN5 USER DATA DESTROY SUCCESS");
-          
+
             // log_main("QUI CI ARRIVA [".$bri->user[0]->name."]");
             $ret = TRUE;
         } while (0);
-      
+
         if ($shm)
             shm_detach($shm);
-      
+
         return ($ret);
     }
 
@@ -645,7 +795,7 @@ class Bin5_user extends User {
         log_crit("BLOCKING_ERROR UNREC: ".($is_unrecoverable ? "TRUE" : "FALSE"));
         return (sprintf(($is_unrecoverable ? 'xstm.stop(); ' : '').'window.onbeforeunload = null; window.onunload = null; document.location.assign("../index.php");'));
     }
-    
+
     protected function page_sync($sess, $page)
     {
         log_rd2("PAGE_SYNC");
@@ -660,31 +810,31 @@ class Bin5_user extends User {
         GLOBAL $G_splash_w, $G_splash_h, $G_splash_timeout;
         $CO_splashdate = "CO_splashdate".$G_splash_idx;
         $$CO_splashdate = $splashdate;
-        
+
         GLOBAL $S_load_stat;
-        
+
         log_rd("maincheck begin");
-        
+
         $ret = FALSE;
         $curtime = time();
-        
+
       /* Nothing changed, return. */
-      if ($cur_step == $this->step) 
+      if ($cur_step == $this->step)
           return (FALSE);
-      
+
       log_rd2("do other cur_stat[".$cur_stat."] user->stat[".$this->stat."] cur_step[".$cur_step."] user_step[".$this->step."]");
-      
+
       if ($cur_step == -1) {
           /*
            *  if $cur_step == -1 load the current state from the main struct
            */
-          
+
           $S_load_stat['wR_minusone']++;
-          
+
           // if ($this->the_end == TRUE) {
           // log_rd2("main_check: the end".var_export(debug_backtrace()));
           // }
-          
+
           if ($this->trans_step != -1) {
               log_rd2("TRANS USATO ".$this->trans_step);
               $cur_step = $this->trans_step;
@@ -694,12 +844,12 @@ class Bin5_user extends User {
               log_rd2("TRANS NON ATTIVATO");
           }
       }
-      
-      
+
+
       /* this part I suppose is read only on $this->room structure */
       if ($cur_step == -1) {
           log_rd2("PRE-NEWSTAT");
-              
+
           /***************
            *             *
            *    TABLE    *
@@ -720,7 +870,7 @@ class Bin5_user extends User {
       else {
           /* $sem = Room::lock_data(FALSE); */
           $S_load_stat['rU_heavy']++;
-          
+
           if ($cur_step < $this->step) {
               do {
                   if ($cur_step + COMM_N < $this->step) {
@@ -735,7 +885,7 @@ class Bin5_user extends User {
                       printf("xXx LOST HISTORY!\n");
                       $new_step = -1;
                       break;
-                  } 
+                  }
                   for ($i = $cur_step ; $i < $this->step ; $i++) {
                       $ii = $i % COMM_N;
                       log_rd2("ADDED TO THE STREAM: ".$this->comm[$ii]);
@@ -745,17 +895,17 @@ class Bin5_user extends User {
                   $new_subst = $this->subst;
                   $new_step =  $this->step;
               } while (0);
-              
+
               log_rd2($this->step, 'index_rd.php: after ret set');
-              
+
               if ($this->the_end == TRUE) {
                   log_rd2("LOGOUT BYE BYE!!");
                   log_auth($this->sess, "Explicit logout.");
-                  
+
                   if ($this->the_end == TRUE) {
                       $this->reset();
-                      
-                      // FIXME !!! 
+
+                      // FIXME !!!
                       /* if ($this->subst == 'sitdown') { */
                       /*     log_load("ROOM WAKEUP"); */
                       /*     $this->room->room_wakeup($this); */
@@ -764,15 +914,15 @@ class Bin5_user extends User {
                       /*     $this->room->room_outstandup($this); */
                       /* else */
                       /*     log_rd2("LOGOUT FROM WHAT ???"); */
-                      
+
                   } /* if ($this->the_end == TRUE) { ... */
               } /* if ($this->the_end == TRUE) { ... */
           } /* if ($cur_step < $this->step) { */
-          
+
           /* Room::unlock_data($sem); */
       }  /* else of if ($cur_step == -1) { */
-      
-    
+
+
       return ($ret);
   }  //   function maincheck (...
 
@@ -794,10 +944,10 @@ class Bin5 {
     var $step; // current step of the comm array
     var $garbage_timeout;
     var $shm_sz;
-    
+
     var $table_idx;
     var $table_token;
-    
+
     var $the_end;
     var $tok;
 
@@ -806,41 +956,41 @@ class Bin5 {
     function Bin5 ($room, $table_idx, $table_token, $get, $post, $cookie) {
         $this->user = array();
         $this->table = array();
-        
+
         $this->the_end = FALSE;
         $this->shm_sz = BIN5_SHM_MIN;
         if (($this->tok = @ftok(FTOK_PATH."/bin5/table".$table_idx."/table", "B")) == -1) {
             echo "FTOK FAILED";
             exit;
         }
-        
+
         $user  = $room->user;
         $table = $room->table[$table_idx];
-        
+
         log_wr("Bin5 constructor");
-        
+
         for ($i = 0 ; $i < $table->player_n ; $i++) {
             $user[$table->player[$i]]->table_token = $table_token;
             $this->user[$i] = Bin5_user::spawn($user[$table->player[$i]], $this, $table_idx, $i, $get, $post, $cookie);
         }
         $this->table[0] = Bin5_table::spawn(&$table);
-        
+
         log_main("TABLE_OLD_WIN - Bin5:".$this->table[0]->old_asta_win);
-        
+
         $this->table_idx = $table_idx;
         $this->table_token = $table_token;
         $this->garbage_timeout = 0;
-        
+
         $this->delay_mgr = new Delay_Manager((GARBAGE_TIMEOUT *3.0) / 2.0);
 
         log_wr("Bin5 constructor end");
     }
-    
+
 
     function get_user($sess, &$idx)
     {
         GLOBAL $PHP_SELF;
-        
+
         if (validate_sess($sess)) {
             for ($i = 0 ; $i < BIN5_MAX_PLAYERS ; $i++) {
                 if (strcmp($sess, $this->user[$i]->sess) == 0) {
@@ -851,21 +1001,21 @@ class Bin5 {
                 }
             }
             log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
-            // for ($i = 0 ; $i < BIN5_MAX_PLAYERS ; $i++) 
+            // for ($i = 0 ; $i < BIN5_MAX_PLAYERS ; $i++)
             // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
         }
         else {
             log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
         }
-        
+
         return (FALSE);
     }
-    
-    
+
+
     function garbage_manager($force)
     {
         GLOBAL $G_base;
-        
+
         /* Garbage collector degli utenti in timeout */
         $ismod = FALSE;
         $curtime = time();
@@ -875,26 +1025,26 @@ class Bin5 {
         if ($force || $this->garbage_timeout < $curtime) {
             for ($i = 0 ; $i < BIN5_MAX_PLAYERS ; $i++) {
                 $user_cur = $this->user[$i];
-                if ($user_cur->sess == "" || 
+                if ($user_cur->sess == "" ||
                     ($user_cur->stat == 'table' && ($user_cur->subst == 'shutdowned' || $user_cur->subst == 'shutdowner')))
                     continue;
-                
+
                 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) { // Auto logout dell'utente
                     log_rd2($user_cur->sess." bin5 AUTO LOGOUT.");
-                    
+
                     if ($user_cur->stat == 'table') {
                         log_auth($user_cur->sess," bin5 Autologout session.");
-                        
-                        /* SI DELEGA AL garbage_manager principale LA RIMOZIONE DELL'UTENTE 
-                           
+
+                        /* SI DELEGA AL garbage_manager principale LA RIMOZIONE DELL'UTENTE
+
                            $tmp_sess = $user_cur->sess;
                            $user_cur->sess = "";
                            Bin5_user::step_unproxy($tmp_sess);
                            $user_cur->name = "";
                            $user_cur->the_end = FALSE;
-                           
+
                         */
-                        
+
                         /* se gli altri utenti non erano d'accordo questo utente viene bannato */
                         $remcalc = $this->table[0]->exitlock_calc(&$this->user, $user_cur->table_pos);
                         if ($remcalc < 3) {
@@ -903,58 +1053,58 @@ class Bin5 {
                                           $user_cur->ip, $user_cur->sess, $user_cur->laccwr + BAN_TIME);
                         }
                         //      $user->bantime = $user->laccwr + BAN_TIME;
-                        
+
                         $this->table_wakeup($user_cur);
                     }
                 }
             }
             log_rd2($user_cur->sess." GARBAGE UPDATED!");
-            
+
             $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
-            
+
             $ismod = TRUE;
         }
-        
+
         $this->delay_mgr->lastcheck_set($curtime);
         return ($ismod);
     }
-    
 
-    function destroy_data() 
+
+    function destroy_data()
     {
         GLOBAL $sess;
 
         $ret =   FALSE;
         $shm =   FALSE;
         log_main("DESTROY BRISKIN5 DATA");
-    
+
         do {
             log_main("DESTROY2 BRISKIN5 DATA [".$this->table_idx."]");
             for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                 $this->user[$i]->destroy_data($this->table_idx);
                 Bin5_user::unproxy_step($this->table_idx, $this->user[$i]->sess);
             }
-            if (($tok = @ftok(FTOK_PATH."/bin5/table".$this->table_idx."/table", "B")) == -1) 
+            if (($tok = @ftok(FTOK_PATH."/bin5/table".$this->table_idx."/table", "B")) == -1)
                 break;
 
             if (($shm = @shmop_open($tok, 'a', 0, 0)) == FALSE)
                 break;
-      
+
             if (shmop_delete($shm) == 0) {
                 log_only("REMOVE FALLITA ");
                 break;
             }
-   
+
             $shm = FALSE;
             log_main("DESTROY2 BRISKIN5 DATA SUCCESS");
-      
+
             // log_main("QUI CI ARRIVA [".$bri->user[0]->name."]");
             $ret = TRUE;
         } while (0);
-    
+
         if ($shm)
             shm_detach($shm);
-    
+
         return ($ret);
     }
 
@@ -963,17 +1113,17 @@ class Bin5 {
         if (($res = file_lock(FTOK_PATH."/bin5/table".$table_idx."/table", $is_exclusive)) != FALSE) {
             self::$delta_t = microtime(TRUE);
             log_lock("LOCK   table [".$table_idx."]         [".self::$delta_t[$table_idx]."]");
-          
+
             return (new Vect(array('res' => $res, 'tab' => $table_idx)));
         }
-      
+
         return (FALSE);
     }
 
-  
+
     static function unlock_data($res_vect)
     {
-        GLOBAL $sess; 
+        GLOBAL $sess;
 
         $res = $res_vect->getbyid('res');
         $tab = $res_vect->getbyid('tab');
@@ -991,11 +1141,11 @@ class Bin5 {
         if ($user->stat == 'table') {
             $table = &$this->table[$user->table];
         }
-    
+
         $user_mesg = substr($mesg,6);
-    
+
         $curtime = time();
-    
+
         $dt = date("H:i ", $curtime);
         if (strncmp($user_mesg, "/nick ", 6) == 0) {
             log_main($user->sess." chatt_send BEGIN");
@@ -1038,22 +1188,22 @@ class Bin5 {
                         $user->flags &= ~USER_FLAG_AUTH; // Remove auth if name changed
                     }
                 }
-    
+
                 $user->name = $name_new;
 
                 log_main($user->sess." chatt_send start set");
-       
+
 
                 for ($i = 0 ; $i < BIN5_MAX_PLAYERS ; $i++) {
                     log_main($user->sess." chatt_send set loop");
-         
+
                     $user_cur = &$this->user[$i];
                     if ($user_cur->sess == '')
                         continue;
-          
+
                     if ($user_cur->stat == 'table' && $user_cur->table == $user->table) {
                         $table = &$this->table[$user->table];
-           
+
                         $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
                         $user_cur->comm[$user_cur->step % COMM_N] .= sprintf('set_names([%d, "%s"], [%d, "%s"], [%d, "%s"], [%d, "%s"], [%d, "%s"]); ',
                                                                              $this->user[$table->player[($user_cur->table_pos) % BIN5_PLAYERS_N]]->flags,
@@ -1088,7 +1238,7 @@ class Bin5 {
                 else {
                     $user_cur = &$this->user[$table->player[$i]];
                 }
-       
+
                 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
                 $user_cur->comm[$user_cur->step % COMM_N] .= sprintf('chatt_sub("%s", [%d, "%s"],"%s");',
                                                                      $dt, $user->flags, xcape($user->name), xcape($user_mesg));
@@ -1107,11 +1257,11 @@ class Bin5 {
         $curtime = time();
 
         log_main("BIN5_WAKEUP from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
-    
+
         for ($i = 0 ; $i < $table->player_n ; $i++) {
             $user_cur = &$this->user[$i];
             log_main("PREIMPOST INLOOP name: ".$user_cur->name);
-      
+
             if ($user_cur == $user)
                 $user_cur->subst = "shutdowner";
             else
@@ -1128,11 +1278,11 @@ class Bin5 {
 
         $this->the_end = TRUE;
     }
-  
+
     /*
      *  If all players are freezed the room garbage_manager clean up table and users.
-     */ 
-    function is_abandoned() 
+     */
+    function is_abandoned()
     {
         $is_ab = TRUE;
         $curtime = time();
@@ -1142,7 +1292,7 @@ class Bin5 {
         for ($i = 0 ; $i < $table->player_n ; $i++) {
             $user_cur = &$this->user[$i];
 
-            if ($user_cur->lacc + (EXPIRE_TIME_RD * 2) >= $curtime) { 
+            if ($user_cur->lacc + (EXPIRE_TIME_RD * 2) >= $curtime) {
                 $is_ab = FALSE;
                 break;
             }
@@ -1156,7 +1306,7 @@ class Bin5 {
         GLOBAL $G_black_list;
 
         printf("NEW_SOCKET (root): %d\n", intval($new_socket));
-        
+
         $enc = get_encoding($header);
         if (isset($header['User-Agent'])) {
             if (strstr($header['User-Agent'], "MSIE")) {
@@ -1171,10 +1321,10 @@ class Bin5 {
         }
         force_no_cache($header_out);
 
-        if (($table_idx = gpcs_var('table_idx', $get, $post, $cookie)) === FALSE) 
+        if (($table_idx = gpcs_var('table_idx', $get, $post, $cookie)) === FALSE)
             unset($table_idx);
-        
-        if (($table_token = gpcs_var('table_token', $get, $post, $cookie)) === FALSE) 
+
+        if (($table_token = gpcs_var('table_token', $get, $post, $cookie)) === FALSE)
             unset($table_token);
 
 
@@ -1185,10 +1335,10 @@ class Bin5 {
             bin5_index_main($transp_type, $header_out, $addr, $get, $post, $cookie);
             $content = ob_get_contents();
             ob_end_clean();
-        
+
             $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
             return TRUE;
-        
+
         break;
         case "index_wr.php":
             // FIXME $content can be unset
@@ -1208,7 +1358,7 @@ class Bin5 {
             }
             $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
             return TRUE;
-            
+
             break;
         case "index_rd_ifra.php":
             if (($transp  = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
@@ -1236,13 +1386,13 @@ class Bin5 {
                     printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
                     $user->rd_socket_set(NULL);
                 }
-                
+
                 $content = "";
                 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
 
                 $response = headers_render($header_out, -1).$user->chunked_content($content);
                 $response_l = mb_strlen($response, "ASCII");
-                
+
                 $wret = @fwrite($new_socket, $response, $response_l);
                 if ($wret < $response_l) {
                     printf("TROUBLES WITH FWRITE: %d\n", $wret);
@@ -1252,17 +1402,17 @@ class Bin5 {
                     $user->rd_cache_set("");
                 }
                 fflush($new_socket);
-                
-                
+
+
                 $s_a_p->socks_set($new_socket, $user, NULL);
                 $user->rd_socket_set($new_socket);
                 printf(" - qui ci siamo - ");
                 return TRUE;
             } while (FALSE);
-            
+
             return FALSE;
             break;
-            
+
         default:
             return FALSE;
             break;
@@ -1290,14 +1440,14 @@ function locshm_exists($tok)
 
         return (TRUE);
     }
-    
+
 }
 
 
-// rendiamo qui l'elenco dei punti come return della func
-function calculate_points(&$table)
+// if success an array with points of each player is returned
+function calculate_points_old(&$table)
 {
-    GLOBAL $G_all_points; 
+    GLOBAL $G_all_points;
 
     $ret = array();
     $pro = 0;
@@ -1316,7 +1466,7 @@ function calculate_points(&$table)
         // for ($i = 0 ; $i < 40 ; $i++) {
         $ctt = $table->card[$i]->value % 10;
         $own = $table->card[$i]->owner;
-        if ($own == $table->asta_win || $own == $table->friend) 
+        if ($own == $table->asta_win || $own == $table->friend)
             $pro += $G_all_points[$ctt];
     }
 
@@ -1336,28 +1486,28 @@ function calculate_points(&$table)
         return($ret);
     }
 
-    if ($pro >= $table->asta_pnt) 
+    if ($pro >= $table->asta_pnt)
         $sig = 1;
     else
         $sig = -1;
 
     $table->points[$table->points_n % MAX_POINTS] = array();
     for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-        if ($i == $table->asta_win) 
+        if ($i == $table->asta_win)
             $pt = ($i == $table->friend ? 4 : 2);
-        else if ($i == $table->friend) 
+        else if ($i == $table->friend)
             $pt = 1;
         else
             $pt = -1;
-    
-    
+
+
 
         log_wr(sprintf("PRO: pt[%d][%d] = %d", $table->points_n % MAX_POINTS, $i, $pt));
 
         $pt = $pt * $sig * $table->multer(TRUE) * ($pro == 120 ? 2 : 1);
 
         log_wr(sprintf("PRO:[%d][%d][%d]", $sig, $table->multer(TRUE), ($pro == 120 ? 2 : 1)));
-    
+
         $table->points[$table->points_n % MAX_POINTS][$i] = $pt;
         $table->total[$i] += $pt;
         $ret[$i] = $pt;
@@ -1365,11 +1515,12 @@ function calculate_points(&$table)
     $table->points_n++;
     $table->old_pnt = $pro;
     $table->mult = 0;
-  
+
     return($ret);
 }
 
-/* show table 
+
+/* show table
    is_transition (is from room to table ?)
    is_again      (is another game)
 
@@ -1396,7 +1547,7 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
 
         /* BACKGROUND */
         $ret .= "background_set();";
-    
+
         /* USERS INFO */
         $ret .= $user->myname_innerHTML();
         $ret .= sprintf('set_names([%d, "%s"], [%d, "%s"], [%d, "%s"], [%d, "%s"], [%d, "%s"]); ',
@@ -1420,7 +1571,7 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
         $ret .= show_table_info(&$bri, &$table, $table_pos);
         $ret .= "setTimeout(preload_images, 500, g_preload_img_arr, g_imgct);";
     }
-    if (!$is_again) 
+    if (!$is_again)
         $ret .= table_welcome($user);
 
     if ($is_transition && !$is_again) { // appena seduti al tavolo, play della mucca
@@ -1431,7 +1582,7 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
     /* CARDS */
     if ($is_transition) { //  && $user->subst ==  "asta" superfluo
         $ret .= "|";
-    
+
         for ($i = 0 ; $i < 8 ; $i++) {
             for ($e = 0 ; $e < BIN5_PLAYERS_N ; $e++) {
                 $ct = 0;
@@ -1444,13 +1595,13 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
                     }
                 }
                 log_rd("O ".$o." VAL ".$table->card[$o]->value." Owner: ".$table->card[$o]->owner);
-       
-                $ret .= sprintf( ' card_send(%d,%d,%d,%8.2f,%d);|', ($table->gstart + $e) % BIN5_PLAYERS_N, 
+
+                $ret .= sprintf( ' card_send(%d,%d,%d,%8.2f,%d);|', ($table->gstart + $e) % BIN5_PLAYERS_N,
                                  $i, ((($e + BIN5_PLAYERS_N - $table_pos + $table->gstart) % BIN5_PLAYERS_N) == 0 ?
-                                      $table->card[$o]->value : -1), 
+                                      $table->card[$o]->value : -1),
                                  ($i == 7 && $e == (BIN5_PLAYERS_N - 1) ? 1 : 0.5),$i+1);
             }
-        }    
+        }
     }
     else {
         $taked  = array(0,0,0,0,0);
@@ -1482,9 +1633,9 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
 
         /* Set ours cards. */
         $oursarg = "";
-        for ($i = 0 ; $i < $inhand[$table_pos] ; $i++) 
+        for ($i = 0 ; $i < $inhand[$table_pos] ; $i++)
             $oursarg .= ($i == 0 ? "" : ", ").$cards[$i];
-        for ($i = $inhand[$table_pos] ; $i < 8 ; $i++) 
+        for ($i = $inhand[$table_pos] ; $i < 8 ; $i++)
             $oursarg .= ($i == 0 ? "" : ", ")."-1";
         $ret .= sprintf('card_setours(%s);', $oursarg);
 
@@ -1495,8 +1646,8 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
                             ($inhand[$i] <= 8 ? $inhand[$i] : 8)  , $taked[$i]);
 
             if ($ontabl[$i] != -1) {
-                $ret .= sprintf('card_place(%d,%d,%d,%d,%d);',$i, $inhand[$i], 
-                                $table->card[$ontabl[$i]]->value, 
+                $ret .= sprintf('card_place(%d,%d,%d,%d,%d);',$i, $inhand[$i],
+                                $table->card[$ontabl[$i]]->value,
                                 $table->card[$ontabl[$i]]->x, $table->card[$ontabl[$i]]->y);
             }
         }
@@ -1509,7 +1660,7 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
         $showst = "";
         for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
             $user_cur = &$bri->user[$table->player[$i]];
-            $showst .= sprintf("%s%d", ($i == 0 ? "" : ", "), 
+            $showst .= sprintf("%s%d", ($i == 0 ? "" : ", "),
                                ($user_cur->asta_card < 9 ? $user_cur->asta_card : $user_cur->asta_pnt));
         }
         if (BIN5_PLAYERS_N == 3)
@@ -1525,8 +1676,8 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
         else {
             /* show auction */
             if ($table_pos == ($table->gstart % BIN5_PLAYERS_N) &&
-                $table->asta_win == -1) 
-                $ret .= sprintf('dispose_asta(%d,%d, %s);', 
+                $table->asta_win == -1)
+                $ret .= sprintf('dispose_asta(%d,%d, %s);',
                                 $table->asta_card + 1, $table->asta_pnt+1, ($user->handpt <= 2 ? "true" : "false"));
             else
                 $ret .= sprintf('dispose_asta(%d,%d, %s);',
@@ -1535,13 +1686,13 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
 
         /* Remark */
         if ($table->asta_win == -1) { // auction case
-            if ($table_pos == ($table->gstart % BIN5_PLAYERS_N)) 
+            if ($table_pos == ($table->gstart % BIN5_PLAYERS_N))
                 $ret .= "remark_on();";
             else
                 $ret .= "remark_off();";
         }
         else { // chooseed case
-            if ($table_pos == $table->asta_win) 
+            if ($table_pos == $table->asta_win)
                 $ret .= "remark_on();";
             else
                 $ret .= "remark_off();";
@@ -1549,14 +1700,14 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
     }
     else if ($user->subst == 'game') {
         /* HIGHLIGHT */
-        if (($table->gstart + $table->turn) % BIN5_PLAYERS_N == $table_pos) 
+        if (($table->gstart + $table->turn) % BIN5_PLAYERS_N == $table_pos)
             $ret .= "is_my_time = true; remark_on();";
         else
             $ret .= "remark_off();";
-    
+
         /* WHO CALL AND WHAT */
         $ret .= briscola_show($bri, $table, $user);
-    
+
     }
     return ($ret);
 } // end function show_table(...
@@ -1577,7 +1728,7 @@ function calculate_winner(&$table)
 
         log_wr(sprintf("Card On table: [%d]", $i));
 
-        $v = $table->card[$i]->value; 
+        $v = $table->card[$i]->value;
         $ontab[$table->card[$i]->owner] = $v;
         $ontid[$table->card[$i]->owner] = $i;
         /* se briscola setto il flag */
@@ -1616,9 +1767,9 @@ function show_table_info(&$bri, &$table, $table_pos)
 
     $pnt_min = $table->points_n - MAX_POINTS < 0 ? 0 : $table->points_n - MAX_POINTS;
     $noty = sprintf('<table class=\"points\"><tr><th></th>');
-  
+
     // Names.
-    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) 
+    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++)
         $noty .= sprintf('<th class=\"td_points\">%s</th>', xcape($bri->user[$table->player[$i]]->name));
     $noty .= sprintf("</tr>");
 
@@ -1627,14 +1778,14 @@ function show_table_info(&$bri, &$table, $table_pos)
 
     for ($i = $pnt_min ; $i < $table->points_n ; $i++) {
         $noty .= sprintf('<tr><th class=\"td_points\">%d</th>', $i+1);
-        for ($e = 0 ; $e < BIN5_PLAYERS_N ; $e++) 
+        for ($e = 0 ; $e < BIN5_PLAYERS_N ; $e++)
             $noty .= sprintf('<td class=\"td_points\">%d</td>', $table->points[$i % MAX_POINTS][$e]);
         $noty .= "</tr>";
     }
 
     // Total points.
     $noty .= '<tr><th class=\"td_points\">Tot.</th>';
-    for ($e = 0 ; $e < BIN5_PLAYERS_N ; $e++) 
+    for ($e = 0 ; $e < BIN5_PLAYERS_N ; $e++)
         $noty .= sprintf('<td class=\"td_points\">%d</td>', $table->total[$e]);
     $noty .= "</tr></table>";
 
@@ -1652,8 +1803,8 @@ function show_table_info(&$bri, &$table, $table_pos)
 
         if ($win != $fri) {
             /* MLANG: "<hr>Nell'ultima mano ha chiamato <b>%s</b>, il socio era <b>%s</b>,<br>", "hanno fatto <b>cappotto</b> EBBRAVI!.<hr>", "dovevano fare <b>%s</b> punti e ne hanno fatti <b>%d</b>: hanno <b>%s</b>.<hr>", "<hr>Nell'ultima mano <b>%s</b> si &egrave; chiamato in mano,<br>", "ha fatto <b>cappotto</b> EBBRAVO!.<hr>", "doveva fare <b>%s</b> punti e ne ha fatti <b>%d</b>: ha <b>%s</b>.<hr>", ($table->old_asta_pnt > 61 ? "almeno ".$table->old_asta_pnt : 'pi&ugrave; di 60'), $table->old_pnt, ($wol == 1 ? "vinto" : ($wol == 0 ? "pareggiato" : "perso" */
-      
-            $noty .= sprintf($mlang_bin5_bin5['info_part'][$G_lang], 
+
+            $noty .= sprintf($mlang_bin5_bin5['info_part'][$G_lang],
                              xcape($bri->user[$win]->name),
                              xcape($bri->user[$fri]->name));
             if ($table->old_pnt == 120) {
@@ -1688,7 +1839,7 @@ function show_table_info(&$bri, &$table, $table_pos)
         $noty .= "<hr><br>";
     }
     /* MLANG: "Fai <b>tu</b> il mazzo,", "Il mazzo a <b>$unam</b>," */
-    if ($table->mazzo == $table_pos) 
+    if ($table->mazzo == $table_pos)
         $noty .= $mlang_bin5_bin5['info_yshuf'][$G_lang];
     else {
         $unam = xcape($bri->user[$table->player[$table->mazzo]]->name);
@@ -1698,7 +1849,7 @@ function show_table_info(&$bri, &$table, $table_pos)
     if ($user->subst == 'asta') {
         if ($table->asta_win == -1)  // auction case
             $curplayer = $table->gstart % BIN5_PLAYERS_N;
-        else 
+        else
             $curplayer = $table->asta_win;
     }
     else if ($user->subst == 'game') {
@@ -1713,20 +1864,20 @@ function show_table_info(&$bri, &$table, $table_pos)
         $unam = xcape($bri->user[$table->player[$curplayer]]->name);
         $noty .= sprintf($mlang_bin5_bin5['info_turn'][$G_lang], $unam);
     }
-  
+
     $multer = $table->multer(TRUE);
     if ($multer > 1) {
         $noty .= sprintf($mlang_bin5_bin5['info_mult'][$G_lang], multoval($multer) );
     }
     $noty .= "<hr><br>";
     $ret .= show_notify($noty, 3000, $mlang_bin5_bin5['btn_bkgame'][$G_lang], 500, 400);
-    /* NOTE: show_notify($noty, 3000, "torna alla partita", 500, 
-     *                   130 + ($table->points_n > 0 ? 50 : 0) + 
+    /* NOTE: show_notify($noty, 3000, "torna alla partita", 500,
+     *                   130 + ($table->points_n > 0 ? 50 : 0) +
      *                   (120 * ($table->points_n / MAX_POINTS)));
-     *       will be used when we refact notify js function following 
-     *       photoo class logic 
-     */ 
-  
+     *       will be used when we refact notify js function following
+     *       photoo class logic
+     */
+
     return ($ret);
 }
 
@@ -1748,9 +1899,9 @@ function briscola_show($bri, $table, $user)
     $ptnadd = "";
     $ret = "";
 
-    if ($table->asta_card == 9) 
+    if ($table->asta_card == 9)
         $ptnadd = sprintf($mlang_bin5_bin5['call_wptn'][$G_lang], $table->asta_pnt);
-  
+
     /* text of caller cell */
     if ($user->table_pos == $table->asta_win) {
         $prestr = sprintf('$("callerinfo").innerHTML = "%s";', $mlang_bin5_bin5['call_ycall'][$G_lang]);
@@ -1758,7 +1909,7 @@ function briscola_show($bri, $table, $user)
     }
     else {
         $prestr = sprintf('$("callerinfo").innerHTML = "%s";', $mlang_bin5_bin5['call_call'][$G_lang]);
-        $ret .= sprintf($prestr, 
+        $ret .= sprintf($prestr,
                         xcape($bri->user[$table->player[$table->asta_win]]->name), $ptnadd);
     }
     $ret .= sprintf('set_iscalling(%d);', ($table->asta_win - $user->table_pos + BIN5_PLAYERS_N) % BIN5_PLAYERS_N);
@@ -1771,7 +1922,7 @@ function briscola_show($bri, $table, $user)
     $ret .= sprintf('$("astalascio").style.visibility = "";');
     $ret .= sprintf('$("asta").style.visibility = "hidden";');
     $ret .= sprintf('show_astat(-2,-2,-2,-2,-2);');
-  
+
     return ($ret);
 }
 
@@ -1794,7 +1945,7 @@ function game_result($asta_pnt, $pnt)
     }
 }
 
-function log_points($remote_addr, $curtime, $user, $where, $mesg) 
+function log_points($remote_addr, $curtime, $user, $where, $mesg)
 {
     if (($fp = @fopen(LEGAL_PATH."/points.log", 'a')) != FALSE) {
         /* Unix time | session | nickname | IP | where was | mesg */
index cdf1b0d..6fdf64d 100644 (file)
@@ -3,7 +3,7 @@
  *  brisk - index_wr.php
  *
  *  Copyright (C) 2006-2012 Matteo Nastasi
- *                          mailto: nastasi@alternativeoutput.it 
+ *                          mailto: nastasi@alternativeoutput.it
  *                                  matteo.nastasi@milug.org
  *                          web: http://www.alternativeoutput.it
  *
@@ -53,24 +53,24 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
     if ($bri == NULL) {
         return FALSE;
     }
-    
-    if (($mesg = gpcs_var('mesg', $get, $post, $cookie)) === FALSE) 
+
+    if (($mesg = gpcs_var('mesg', $get, $post, $cookie)) === FALSE)
         unset($mesg);
-    
-    if (($sess = gpcs_var('sess', $get, $post, $cookie)) === FALSE) 
+
+    if (($sess = gpcs_var('sess', $get, $post, $cookie)) === FALSE)
         $sess = "";
 
     log_wr('COMM: '.$mesg);
 
 
-    if (($CO_bin5_pref_ring_endauct = gpcs_var('CO_bin5_pref_ring_endauct', $get, $post, $cookie)) === FALSE) 
+    if (($CO_bin5_pref_ring_endauct = gpcs_var('CO_bin5_pref_ring_endauct', $get, $post, $cookie)) === FALSE)
         $CO_bin5_pref_ring_endauct = "";
 
 
-    
+
     log_wr(0, 'bin::index_wr.php: COMM: '.xcapemesg($mesg));
-    
-    
+
+
     if (($user = &$bri->get_user($sess, &$idx)) == FALSE) {
         echo "Get User Error";
         log_wr("Get User Error");
@@ -83,18 +83,18 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
     }
 
     $argz = explode('|', $mesg);
-    
+
     log_wr('POSTSPLIT: '.$argz[0].'  user->stat: ['.$user->stat.']');
     log_wr($user->step, 'bin::index_wr.php: after get_user()');
 
     $user->lacc = $curtime;
-    
+
     if ($argz[0] == 'ping') {
         log_wr("PING RECEIVED");
     }
     else if (false && $argz[0] == 'shutdown') {
         log_auth($user_cur->sess, "Shutdown session. delegate to room gc the autologout");
-        
+
         log_rd2("bin5/index_wr.php: AUTO LOGOUT.");
         if ($user->stat == 'table') {
             $bri->table_wakeup($user);
@@ -112,7 +112,7 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
     else if ($user->stat == 'table') {
         $user->laccwr = time();
         $table = $bri->table[$user->table];
-        
+
         if ($argz[0] == 'tableinfo') {
             log_wr("PER DI TABLEINFO");
             $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
@@ -125,7 +125,7 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
         }
         else if ($argz[0] == 'preferences_update') {
             log_wr("PER DI PREFERENCES_UPDATE");
-            
+
             if ($CO_bin5_pref_ring_endauct == "true")
                 $user->privflags |= BIN5_USER_FLAG_RING_ENDAUCT;
             else
@@ -133,12 +133,12 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
         }
         else if ($argz[0] == 'logout') {
             $remcalc = $argz[1];
-            
+
             if ($user->exitislock == TRUE) {
                 $remcalc++;
                 $user->exitislock = FALSE;
             }
-            
+
             $logout_cont = TRUE;
             if ($remcalc >= 3) {
                 $lockcalc = $table->exitlock_calc(&$bri->user, $user->table_pos);
@@ -146,7 +146,7 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                     $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
                     $user->comm[$user->step % COMM_N] .= $table->exitlock_show(&$bri->user, $user->table_pos);
                     $user->comm[$user->step % COMM_N] .=  show_notify("<br>I dati presenti sul server non erano allineati con quelli inviati dal tuo browser, adesso lo sono. Riprova ora.", 2000, "torna alla partita.", 400, 100);
-                    
+
                     log_wr($user->comm[$user->step % COMM_N]);
                     $user->step_inc();
                     $logout_cont = FALSE;
@@ -158,7 +158,7 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                               $user->ip, $user->sess, $user->laccwr + BAN_TIME);
             }
             //      $user->bantime = $user->laccwr + BAN_TIME;
-            
+
             if ($logout_cont == TRUE) {
                 $bri->table_wakeup(&$user);
             }
@@ -166,14 +166,14 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
         else if ($argz[0] == 'exitlock') {
             if ($user->exitislock == TRUE) {
                 $user->exitislock = ($user->exitislock == TRUE ? FALSE : TRUE);
-                for ($ct = 0, $i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {   
+                for ($ct = 0, $i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                     $user_cur[$i] = &$bri->user[$table->player[$i]];
                     if ($user_cur[$i]->exitislock == FALSE)
                         $ct++;
                 }
                 for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                     $ret = sprintf('gst.st = %d;', $user_cur[$i]->step+1);
-                    $ret .= sprintf('exitlock_show(%d, %s);', $ct, 
+                    $ret .= sprintf('exitlock_show(%d, %s);', $ct,
                                     ($user_cur[$i]->exitislock ? 'true' : 'false'));
                     $user_cur[$i]->comm[$user_cur[$i]->step % COMM_N] = $ret;
                     log_wr($user_cur[$i]->comm[$user_cur[$i]->step % COMM_N]);
@@ -182,38 +182,55 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
             }
         }
         else if ($user->subst == 'asta') {
-            if ($argz[0] == 'lascio' && $user->handpt <= 2) {
-                $index_cur = $table->gstart % BIN5_PLAYERS_N;
-                
-                log_wr(sprintf("GIOCO FINITO !!!"));
-                
-                $table->mult += 1; 
-                $table->old_reason = sprintf("Ha lasciato %s perché aveva al massimo 2 punti.", xcape($user->name));
-                
-                // Non si cambia mazzo se si abbandona la partita
-                // $table->game_next();
-                $table->game_init(&$bri->user);
-                
-                for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {    
-                    $user_cur = &$bri->user[$table->player[$i]];
-                    
-                    $ret = sprintf('gst.st = %d;', $user_cur->step+1);
-                    $ret .= show_table(&$bri,&$user_cur,$user_cur->step+1, TRUE, TRUE);
-                    $user_cur->comm[$user_cur->step % COMM_N] = $ret;
-                    $user_cur->step_inc();         
+            if ($argz[0] == 'lascio') {
+                //  && $user->handpt <= 2) {
+                /* $index_cur = $table->gstart % BIN5_PLAYERS_N; */
+
+                /* log_wr(sprintf("GIOCO FINITO !!!")); */
+
+                /* $table->mult += 1;  */
+                /* $table->old_reason = sprintf("Ha lasciato %s perché aveva al massimo 2 punti.", xcape($user->name)); */
+
+                /* // Non si cambia mazzo se si abbandona la partita */
+                /* $table->game_next(0); */
+
+                /* if ($user->table_orig < TABLES_AUTH_N) { */
+                /*     require_once("../Obj/dbase_".$G_dbasetype.".phh"); */
+
+                /*     if (($bdb = BriskDB::create()) != FALSE) { */
+                /*         $bdb->bin5_points_save($curtime, $table, $user->table_orig, $ucodes, $pt_cur); */
+                /*         unset($bdb); */
+                /*     } */
+                /*     else { */
+                /*         log_points($remote_addr, $curtime, $user, "STAT:BRISKIN5:FINISH_GAME", "DATABASE CONNECTION FAILED"); */
+                /*     } */
+                /*     log_points($curtime, $user, "STAT:BRISKIN5:FINISH_GAME", $plist); */
+                /* } */
+
+                /* $table->game_init(&$bri->user); */
+
+                if ($table->rules_engine(&$bri, BIN5_RULES_ABANDON, $user)) {
+                    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                        $user_cur = &$bri->user[$table->player[$i]];
+
+                        $ret = sprintf('gst.st = %d;', $user_cur->step+1);
+                        $ret .= show_table(&$bri,&$user_cur,$user_cur->step+1, TRUE, TRUE);
+                        $user_cur->comm[$user_cur->step % COMM_N] = $ret;
+                        $user_cur->step_inc();
+                    }
                 }
             }
             else if ($argz[0] == 'asta') {
                 $again = TRUE;
-                
+
                 $index_cur = $table->gstart % BIN5_PLAYERS_N;
                 if ($user->table_pos == $index_cur &&
                     $table->asta_pla[$index_cur]) {
                     $a_card = $argz[1];
                     $a_pnt  = $argz[2];
-                    
+
                     log_wr("CI SIAMO  a_card ".$a_card."  asta_card ".$table->asta_card);
-                    
+
                     // Abbandono dell'asta
                     if ($a_card <= -1) {
                         log_wr("Abbandona l'asta.");
@@ -227,8 +244,8 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                             $again = FALSE;
                         else if ($a_card == 9 && $a_pnt > ($table->asta_pnt >= 61 ? $table->asta_pnt : 60) && $a_pnt <= 120)
                             $again = FALSE;
-                        
-                        
+
+
                         if ($again == FALSE) {
                             log_wr("NUOVI ORZI.");
                             $user->asta_card  = $a_card;
@@ -239,36 +256,36 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                             }
                         }
                     }
-                    
-      
-      
+
+
+
                     if ($again) { // Qualcosa non andato bene, rifare
-                        $ret = sprintf('gst.st = %d; asta_pnt_set(%d);', $user->step+1, 
+                        $ret = sprintf('gst.st = %d; asta_pnt_set(%d);', $user->step+1,
                                        ($table->asta_pnt > 60 ? $table->asta_pnt + 1 : 61) );
                         $user->comm[$user->step % COMM_N] = $ret;
                         $user->step_inc();
-                        
+
                         log_wr("Ripetere.");
                     }
                     else {
                         /* next step */
-                        $showst = "show_astat("; 
+                        $showst = "show_astat(";
                         for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                             $user_cur = &$bri->user[$table->player[$i]];
-                            $showst .= sprintf("%s%d", ($i == 0 ? "" : ", "), 
+                            $showst .= sprintf("%s%d", ($i == 0 ? "" : ", "),
                                                ($user_cur->asta_card < 9 ? $user_cur->asta_card : $user_cur->asta_pnt));
                         }
                         if (BIN5_PLAYERS_N == 3)
                             $showst .= ",-2,-2";
                         $showst .= ");";
-                        
+
                         $maxcard = -2;
                         for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                             $user_cur = &$bri->user[$table->player[$i]];
                             if ($maxcard < $user_cur->asta_card)
                                 $maxcard = $user_cur->asta_card;
                         }
-                        
+
                         if (($table->asta_pla_n > ($maxcard > -1 ? 1 : 0)) &&
                             !($table->asta_card == 9 && $table->asta_pnt == 120)) {
                             log_wr("ALLOPPA QUI");
@@ -280,13 +297,13 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                                     break;
                                 }
                             }
-                            
-                            
+
+
                             for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                                 $user_cur = &$bri->user[$table->player[$i]];
                                 $ret = sprintf('gst.st = %d; %s', $user_cur->step+1, $showst);
-                                if ($user_cur->table_pos == ($table->gstart % BIN5_PLAYERS_N)) 
-                                    $ret .= sprintf('dispose_asta(%d,%d, %s); remark_on();', 
+                                if ($user_cur->table_pos == ($table->gstart % BIN5_PLAYERS_N))
+                                    $ret .= sprintf('dispose_asta(%d,%d, %s); remark_on();',
                                                     $table->asta_card + 1, $table->asta_pnt+1, ($user_cur->handpt <= 2 ? "true" : "false"));
                                 else
                                     $ret .= sprintf('dispose_asta(%d,%d, %s); remark_off();',
@@ -297,22 +314,16 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                         }
                         else if ($table->asta_pla_n == 0) {
                             log_wr("PASSANO TUTTI!");
-                            
-                            log_wr(sprintf("GIOCO FINITO !!!"));
-                            
-                            $table->old_reason = "Hanno passato tutti.";
-                            $table->mult += 1; 
-                            
-                            $table->game_next();
-                            $table->game_init(&$bri->user);
-                            
-                            for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {        
-                                $user_cur = &$bri->user[$table->player[$i]];
-                                
-                                $ret = sprintf('gst.st = %d;', $user_cur->step+1);
-                                $ret .= show_table(&$bri,&$user_cur,$user_cur->step+1, TRUE, TRUE);
-                                $user_cur->comm[$user_cur->step % COMM_N] = $ret;
-                                $user_cur->step_inc();     
+
+                            if ($table->rules_engine(&$bri, BIN5_RULES_ALLPASS, $user)) {
+                                for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                                    $user_cur = &$bri->user[$table->player[$i]];
+
+                                    $ret = sprintf('gst.st = %d;', $user_cur->step+1);
+                                    $ret .= show_table(&$bri,&$user_cur,$user_cur->step+1, TRUE, TRUE);
+                                    $user_cur->comm[$user_cur->step % COMM_N] = $ret;
+                                    $user_cur->step_inc();
+                                }
                             }
                         }
                         else {
@@ -320,13 +331,13 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                             // if a_pnt == 120 supergame ! else abbandono
                             if ($a_pnt == 120 || $user->asta_card != -1) {
                                 $chooser = $index_cur;
-                                for ($i = 1 ; $i < BIN5_PLAYERS_N ; $i++) 
+                                for ($i = 1 ; $i < BIN5_PLAYERS_N ; $i++)
                                     if ($i != $chooser)
                                         $table->asta_pla[$i] = FALSE;
                             }
                             else {
                                 /*
-                                  $user->comm[$user->step % COMM_N] = sprintf( "gst.st = %d; dispose_asta(%d, %d, false); remark_off();", 
+                                  $user->comm[$user->step % COMM_N] = sprintf( "gst.st = %d; dispose_asta(%d, %d, false); remark_off();",
                                   $user->step+1, $table->asta_card + 1,-($table->asta_pnt));
                                   $user->step_inc();
                                 */
@@ -338,21 +349,21 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                                 }
                             }
                             $table->asta_win = $chooser;
-                            
+
                             for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                                 $user_cur = &$bri->user[$table->player[$i]];
                                 $ret = sprintf('gst.st = %d; %s dispose_asta(%d, %d, false);', $user_cur->step+1, $showst,
                                                $table->asta_card + 1,-($table->asta_pnt));
-                                
+
                                 if ($i == $chooser) {
                                     $ret .= "choose_seed(". $table->asta_card."); remark_on();";
                                 }
                                 else {
                                     $ret .= "remark_off();";
                                 }
-                                
+
                                 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
-                                $user_cur->step_inc();     
+                                $user_cur->step_inc();
                             }
                         }
                     }
@@ -363,7 +374,7 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
             }
             /*  asta::choose */
             else if ($argz[0] == 'choose') {
-                if ($table->asta_win > -1 && 
+                if ($table->asta_win > -1 &&
                     $user->table_pos == $table->asta_win) {
                     $a_brisco = $argz[1];
                     if ($a_brisco >= 0 && $a_brisco < 40) {
@@ -372,81 +383,81 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                         log_wr("GSTART 2");
                         $table->gstart = ($table->mazzo+1) % BIN5_PLAYERS_N;
                         log_wr("Setta la briscola a ".$a_brisco);
-                        
+
                         $chooser = $table->asta_win;
                         $user_chooser = &$bri->user[$table->player[$chooser]];
                         for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                             $user_cur = &$bri->user[$table->player[$i]];
                             $user_cur->subst = 'game';
                             $ret = sprintf('gst.st = %d; subst = "game";', $user_cur->step+1);
-                            
+
                             if ($user_cur->privflags & BIN5_USER_FLAG_RING_ENDAUCT) {
                                 // $ret .= "var de_che= 33;";
                                 $ret .= playsound("ringbell.mp3");
                             }
                             $ret .= sprintf('document.title = "Brisk - Tavolo %d";', $user->table_orig);
-                            
+
                             /* bg of caller cell */
                             $ret .= briscola_show($bri, $table, $user_cur);
-                            
+
                             /* first gamer */
                             if ($i == ($table->gstart % BIN5_PLAYERS_N))
                                 $ret .= "is_my_time = true; remark_on();";
                             else
                                 $ret .= "is_my_time = false; remark_off();";
-                            
+
                             $user_cur->comm[$user_cur->step % COMM_N] = $ret;
-                            $user_cur->step_inc();         
+                            $user_cur->step_inc();
                         }
                         /*
                           TUTTE LE VARIABILI DI STATO PER PASSARE A GIOCARE E LE
                           VAR PER PASSARE ALLA FASE DI GIOCO
                         */
-                        
+
                     }
                 }
             }
         }
         else if ($user->subst == 'game') {
             log_wr("state: table::game".$argz[0]);
-            
+
             if ($argz[0] == 'play') {
                 $a_play = $argz[1];
                 $a_x =    $argz[2];
                 $a_y =    $argz[3];
-                
+
                 if (strpos($a_x, "px") != FALSE)
                     $a_x = substr($a_x,0,-2);
                 if (strpos($a_y, "px") != FALSE)
                     $a_y = substr($a_y,0,-2);
-                
+
                 $loggo = sprintf("A_play %s, table_pos %d == %d, mazzo %d, gstart %d, card_stat %d, card_own %d",
                                  $a_play, $user->table_pos, ($table->gstart % BIN5_PLAYERS_N),
                                  $table->mazzo, $table->gstart,
                                  $table->card[$a_play]->stat, $table->card[$a_play]->owner);
                 log_wr("CIC".$loggo);
-                
+
                 /* se era il suo turno e la carta era sua ed era in mano */
                 if ($a_play >=0 && $a_play < (BIN5_PLAYERS_N == 5 ? 40 : 24) &&
                     ($user->table_pos == (($table->gstart + $table->turn) % BIN5_PLAYERS_N)) &&
                     $table->card[$a_play]->stat == 'hand' &&
                     $table->card[$a_play]->owner == $user->table_pos) {
                     log_wr(sprintf("User: %s Play: %d",$user->name, $a_play));
-                    
+
                     /* Change the card status. */
                     $table->card[$a_play]->play($a_x, $a_y);
-                    
+
                     /*
                      *  !!!! TURN INCREMENTED BEFORE !!!!
                      */
                     $turn_cur = ($table->gstart + $table->turn) % BIN5_PLAYERS_N;
                     $table->turn++;
-                    
+
                     $card_play = sprintf("card_play(%d,%d,%d,%d);|",
                                          $user->table_pos, $a_play, $a_x, $a_y);
                     if (($table->turn % BIN5_PLAYERS_N) != 0) {     /* manche not finished */
                         $turn_nex = ($table->gstart + $table->turn) % BIN5_PLAYERS_N;
-                        
+
                         $player_cur = "remark_off();";
                         $player_nex = $card_play . "is_my_time = true; remark_on();";
                         $player_oth = $card_play;
@@ -456,10 +467,10 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                         log_wr("GSTART 3");
                         $table->gstart = $winner;
                         $turn_nex = ($table->gstart + $table->turn) % BIN5_PLAYERS_N;
-                        
+
                         log_wr(sprintf("The winner is: [%d] [%s]", $winner, $bri->user[$table->player[$winner]]->name));
                         $card_take = sprintf("sleep(gst,2000);|cards_take(%d);|", $winner);
-                        $player_cur = "remark_off();" . $card_take; 
+                        $player_cur = "remark_off();" . $card_take;
                         if ($turn_cur != $turn_nex)
                             $player_nex = $card_play . $card_take;
                         else
@@ -468,81 +479,83 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                             $player_nex .= "is_my_time = true; remark_on();";
                         $player_oth = $card_play . $card_take;
                     }
-                    
+
                     log_wr(sprintf("Turn Cur %d Turn Nex %d",$turn_cur, $turn_nex));
-                    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {        
+                    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                         $user_cur = &$bri->user[$table->player[$i]];
-                        
+
                         $ret = sprintf('gst.st = %d; ', $user_cur->step+1);
-                        
-                        
+
+
                         if ($i == $turn_cur) {
-                            $ret .= $player_cur;         
+                            $ret .= $player_cur;
                         }
                         if ($i == $turn_nex) {
-                            $ret .= $player_nex;         
+                            $ret .= $player_nex;
                         }
                         if ($i != $turn_cur && $i != $turn_nex) {
                             $ret .= $player_oth;
                         }
-                        
+
                         $retar[$i] = $ret;
                     }
-                    
+
                     if ($table->turn == (BIN5_PLAYERS_N * 8)) { /* game finished */
                         log_wr(sprintf("GIOCO FINITO !!!"));
-                        
-                        
+
+
                         /* ************************************************ */
                         /*    PRIMA LA PARTE PER LO SHOW DI CHI HA VINTO    */
                         /* ************************************************ */
-                        $pt_cur = calculate_points(&$table);
-                        
-                        $plist = "$table->table_token|$user->table_orig|$table->player_n";
-                        $ucodes = array();
-                        for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-                            $user_cur = &$bri->user[$table->player[$i]];
-                            $plist .= '|'.xcapelt($user_cur->name).'|'.$pt_cur[$i];
-                            $ucodes[$i] = $user_cur->code_get();
-                        }
-                        for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-                            $plist .= '|'.xcapelt($ucodes[$i]);
-                        }
-                        log_legal($curtime, $user->ip, $user, "STAT:BRISKIN5:FINISH_GAME", $plist);
-                        $table->game_next();
-                        if ($user->table_orig < TABLES_AUTH_N) {
-                            require_once("../Obj/dbase_".$G_dbasetype.".phh");
-                            
-                            if (($bdb = BriskDB::create()) != FALSE) {
-                                $bdb->bin5_points_save($curtime, $table, $user->table_orig, $ucodes, $pt_cur);
-                                unset($bdb);
-                            }
-                            else {
-                                log_points($remote_addr, $curtime, $user, "STAT:BRISKIN5:FINISH_GAME", "DATABASE CONNECTION FAILED");
+                        /* $pt_cur = calculate_points(&$table); */
+                        /* $table->game_next(1); */
+
+                        /* $plist = "$table->table_token|$user->table_orig|$table->player_n"; */
+                        /* $ucodes = array(); */
+                        /* for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) { */
+                        /*     $user_cur = &$bri->user[$table->player[$i]]; */
+                        /*     $plist .= '|'.xcapelt($user_cur->name).'|'.$pt_cur[$i]; */
+                        /*     $ucodes[$i] = $user_cur->code_get(); */
+                        /* } */
+                        /* for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) { */
+                        /*     $plist .= '|'.xcapelt($ucodes[$i]); */
+                        /* } */
+                        /* log_legal($curtime, $user->ip, $user, "STAT:BRISKIN5:FINISH_GAME", $plist); */
+                        /* if ($user->table_orig < TABLES_AUTH_N) { */
+                        /*     require_once("../Obj/dbase_".$G_dbasetype.".phh"); */
+
+                        /*     if (($bdb = BriskDB::create()) != FALSE) { */
+                        /*         $bdb->bin5_points_save($curtime, $table, $user->table_orig, $ucodes, $pt_cur); */
+                        /*         unset($bdb); */
+                        /*     } */
+                        /*     else { */
+                        /*         log_points($remote_addr, $curtime, $user, "STAT:BRISKIN5:FINISH_GAME", "DATABASE CONNECTION FAILED"); */
+                        /*     } */
+                        /*     log_points($curtime, $user, "STAT:BRISKIN5:FINISH_GAME", $plist); */
+                        /* } */
+
+                        /* $table->game_init(&$bri->user); */
+
+                        if ($table->rules_engine(&$bri, BIN5_RULES_FINISH, $user)) {
+                            for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                                $user_cur = &$bri->user[$table->player[$i]];
+                                $retar[$i] .= show_table(&$bri,&$user_cur,$user_cur->step+1,TRUE, TRUE);
                             }
-                            log_points($curtime, $user, "STAT:BRISKIN5:FINISH_GAME", $plist);
-                        }
-                        
-                        $table->game_init(&$bri->user);
-                        
-                        for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-                            $user_cur = &$bri->user[$table->player[$i]];
-                            $retar[$i] .= show_table(&$bri,&$user_cur,$user_cur->step+1,TRUE, TRUE);
                         }
                     }
-                    
-                    
-                    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {        
+
+
+                    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                         $user_cur = &$bri->user[$table->player[$i]];
-                        
+
                         $user_cur->comm[$user_cur->step % COMM_N] = $retar[$i];
-                        $user_cur->step_inc();     
+                        $user_cur->step_inc();
                     }
-                    
+
                     log_wr(sprintf("TURN: %d",$table->turn));
                     /* Have played all the players ? */
                     /* NO:  switch the focus and enable the next player to play. */
-                    
+
                     /* YES: calculate who win and go to the next turn. */
                 }
             }