Merge remote-tracking branch 'origin/together-for-fun' into nginx
authorMatteo Nastasi <nastasi@alternativeoutput.it>
Sun, 9 Jul 2017 17:02:31 +0000 (19:02 +0200)
committerMatteo Nastasi <nastasi@alternativeoutput.it>
Sun, 9 Jul 2017 17:02:31 +0000 (19:02 +0200)
Conflicts:
web/briskin5/Obj/briskin5.phh
web/briskin5/index_wr.php
web/briskin5/stat-day.php
web/briskin5/statadm.php

1  2 
INSTALL.sh
web/Obj/brisk.phh
web/Obj/dbase_pgsql.phh
web/Obj/user.phh
web/briskin5/Obj/briskin5.phh
web/briskin5/index.php
web/briskin5/index_wr.php
web/index.php

diff --combined INSTALL.sh
@@@ -85,7 -85,7 +85,7 @@@ function searchetc() 
          fi
          pp="$(dirname "$pp")"
      done
-     
      return 1
  }
  
@@@ -227,7 -227,7 +227,7 @@@ echo "    web_only:   \"$web_only\"
  echo "    test_add:   \"$test_add\""
  
  if [ ! -z "$outconf" ]; then
-   ( 
+   (
      echo "#"
      echo "#  Produced automatically by brisk::INSTALL.sh"
      echo "#"
@@@ -324,7 -324,7 +324,7 @@@ if [ "$web_only" = "FALSE" ]; the
        exit 3
      fi
      rm $ftokk_path/spy.txt
-     
      # create the fs subtree to enable ftok-ing
      touch ${ftokk_path}/main
      chmod 666 ${ftokk_path}/main
      done
      chmod -R 777 ${proxy_path}/bin5
  
 +    mkdir -p "${legal_path}"
 +    chmod 777 "${legal_path}"
  fi
  install -d ${web_path}__
  for i in $(find web -type d | grep '/' | sed 's/^....//g'); do
-     install -d ${web_path}__/$i 
+     install -d ${web_path}__/$i
  done
  
  for i in $(find web -name '.htaccess' -o -name '*.php' -o -name '*.phh' -o -name '*.pho' -o -name '*.css' -o -name '*.js' -o -name '*.mp3' -o -name '*.swf' -o -name 'terms-of-service*' | sed 's/^....//g'); do
      install -m 644 "web/$i" "${web_path}__/$i"
  done
 +
 +# hardlink for nginx managed websocket files.
 +ln "${web_path}__/xynt_test01.php" "${web_path}__/xynt_test01_wss.php"
 +
  if [ "$test_add" = "TRUE" ]; then
      for i in $(find webtest -name '.htaccess' -o -name '*.php' -o -name '*.phh' -o -name '*.pho' -o -name '*.css' -o -name '*.js' -o -name '*.mp3' -o -name '*.swf' -o -name 'terms-of-service*' | sed 's/^........//g'); do
          install -m 644 "webtest/$i" "${web_path}__/$i"
diff --combined web/Obj/brisk.phh
@@@ -153,10 -153,10 +153,10 @@@ $mlang_brisk = array( 'btn_backstand'=
  $G_lng = langtolng($G_lang);
  
  $G_all_points = array( 11,10,4,3,2, 0,0,0,0,0 );
- $G_brisk_version = "5.2.1";
+ $G_brisk_version = "5.4.1";
  
  /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
- $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: puoi creare la tua rete di amicizie con /info, vedere cosa pensano i tuoi amici degli altri utenti e ci sono i nuovi tavoli riservati per registrati e apprendisti, corretti alcuni errori.',
+ $root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: potete scegliere che regole usare per giocare dal menu "Prefs" al tavolo, descrizioni piĆ¹ consistenti.',
                                         'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ),
                         'en' => array ( 'EN Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: puoi creare la tua rete di amicizie con /info,',
                                         'vedere cosa pensano i tuoi amici degli altri utenti e tavoli riservati per registrati e apprendisti.',
@@@ -2803,10 -2803,9 +2803,10 @@@ class Bris
  
            break;
        case "index_rd.php":
 +      case "index_rd_wss.php":
            if (($transp  = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
                $transp = "iframe";
 -          if ($transp == 'websocket')
 +          if ($transp == 'websocket' || $transp == 'websocketsec')
                $enc = 'plain';
  
            do {
            $subs = "briskin5/";
            $subs_l = strlen($subs);
            if (!strncmp($path, $subs, $subs_l)) {
 -              $ret = Bin5::request_mgr(&$s_a_p, $header, &$header_out, &$new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
 +              $ret = Bin5::request_mgr($s_a_p, $header, $header_out, $new_socket, substr($path, $subs_l) , $addr, $get, $post, $cookie);
                return ($ret);
            }
            break;
diff --combined web/Obj/dbase_pgsql.phh
@@@ -430,7 -430,7 +430,7 @@@ class BriskD
              }
  
              if ($chals->ismod()) {
 -                Challenges::save_data(&$chals);
 +                Challenges::save_data($chals);
              }
  
              Challenges::unlock_data($a_sem);
          }
          $gam_obj = pg_fetch_object($gam_pg, 0);
  
-         $table->old_reason = game_description($gam_obj->act, 'html', $gam_obj->mult,
-                                               $gam_obj->asta_win, ($gam_obj->asta_win != -1 ?
-                                                                    $users[$gam_obj->asta_win]['login'] : ""),
-                                               $gam_obj->friend, ($gam_obj->friend != -1 ?
-                                                                  $users[$gam_obj->friend]['login'] : ""),
-                                               $gam_obj->pnt, $gam_obj->asta_pnt);
          // update matches with new ttok and table idx
          $mtc_sql = sprintf("UPDATE %sbin5_matches SET (ttok, tidx) = ('%s', %d) WHERE code = %d RETURNING *;",
                             $G_dbpfx, $sql_ttok, $tidx, $match_code);
              log_crit(sprintf("%s::%s: update matches table failed", __CLASS__, __FUNCTION__));
              return (FALSE);
          }
+         $mtc_obj = pg_fetch_object($mtc_pg, 0);
+         $old_rules = $table->rules;
+         $rules_name = rules_id2name($mtc_obj->tcode);
+         $table->rules = new $rules_name($table);
+         unset($old_rules);
+         $table->old_reason = ${rules_name}::game_description($gam_obj->act, 'html', $gam_obj->mult,
+                                               $gam_obj->asta_win, ($gam_obj->asta_win != -1 ?
+                                                                    $users[$gam_obj->asta_win]['login'] : ""),
+                                               $gam_obj->friend, ($gam_obj->friend != -1 ?
+                                                                  $users[$gam_obj->friend]['login'] : ""),
+                                               $gam_obj->pnt, $gam_obj->asta_pnt, $gam_obj->tourn_pts);
  
          return (TRUE);
      }
              if (($mtc_pg  = $this->query($mtc_sql)) == FALSE || pg_numrows($mtc_pg) != 1) {
  
                  // match not exists, insert it
-                 $mtc_sql = sprintf("INSERT INTO %sbin5_matches (ttok, tidx, mazzo_next, mult_next) VALUES ('%s', %d, %d, %d) RETURNING *;",
-                                    $G_dbpfx, $sql_ttok, $tidx, $table->mazzo, $table->mult);
+                 // , BIN5_TOURNAMENT_NO_DRAW
+                 $mtc_sql = sprintf("INSERT INTO %sbin5_matches (ttok, tidx, mazzo_next, mult_next, tcode) VALUES ('%s', %d, %d, %d, %d) RETURNING *;",
+                                    $G_dbpfx, $sql_ttok, $tidx, $table->mazzo, $table->mult, $table->rules->id_get());
                  if (($mtc_pg  = $this->query($mtc_sql)) == FALSE || pg_affected_rows($mtc_pg) != 1) {
                      log_crit(sprintf("bin5_points_save: failed at insert match [%s]", $mtc_sql));
                      break;
              /*
               * games management
               */
-             $gam_sql = sprintf("INSERT INTO %sbin5_games (mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult)
-                                                VALUES (%d, to_timestamp(%d), %d, %d, %d, %d, %d, %d, %d) RETURNING *;",
+             $gam_sql = sprintf("INSERT INTO %sbin5_games (mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult, tourn_pts)
+                                                VALUES (%d, to_timestamp(%d), %d, %d, %d, %d, %d, %d, %d, %d) RETURNING *;",
                                 $G_dbpfx, $mtc_obj->code, $date, $action,
                                 $table->old_asta_pnt, $table->old_pnt,
                                 $table->old_asta_win,
                                 $table->old_friend,
-                                $table->old_mazzo, $table->old_mult);
+                                $table->old_mazzo, $table->old_mult,
+                                $table->old_tourn_pts);
              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;
diff --combined web/Obj/user.phh
@@@ -707,7 -707,8 +707,8 @@@ class User 
                        }
                    }
                }
-               if ($G_with_splash &&
+               // if ($G_with_splash &&
+               if ($this->is_auth() && (! $this->is_appr()) && $G_with_splash &&
                    ($splashdate < $curtime - $G_splash_interval ||
                     $splashdate > $curtime)) {
                    $is_super = $this->flags & USER_FLAG_TY_SUPER;
@@@ -830,7 -831,7 +831,7 @@@ function stream_init($init_string, $enc
      
      $this->rd_data_set($curtime, $transp, $enc, $stat, $subst, $step, $from);
      
 -    $ret = $this->rd_transp->init($enc, $header, &$header_out, $init_string, self::base_get(), $this->rd_scristp);
 +    $ret = $this->rd_transp->init($enc, $header, $header_out, $init_string, self::base_get(), $this->rd_scristp);
  
      if ($ret === FALSE) {
          return FALSE;
@@@ -30,10 -30,9 +30,9 @@@ define('BIN5_SHM_MAX', (BIN5_SHM_MIN + 
  define('BIN5_SHM_DLT', 32768);
  define('BIN5_PROXY_PATH', PROXY_PATH."/bin5");
  
- define('BIN5_RULES_OLDSCHEMA', -1);
- define('BIN5_RULES_FINISH',     0);
- define('BIN5_RULES_ABANDON',    1);
- define('BIN5_RULES_ALLPASS',    2);
+ require_once('rules.phh');
+ define('BIN5_TOURNAMENT_CURRENT', BIN5_TOURNAMENT_NO_DRAW);
  
  $mlang_bin5_bin5 = array(
                           // br, hr, b, /b, win, fri
                                                 'en' => '%3$slast hand%4$s'),
                           'info_curr' => array( 'it' => '%3$smano corrente%4$s',
                                                 'en' => '%3$scurrent hand%4$s'),
-                          // br, hr, b, /b, win, fri
-                          'info_part' => array( 'it' => 'Ha chiamato %3$s%5$s%4$s, il socio era %3$s%6$s%4$s,%1$s',
-                                                'en' => 'The declarer was %3$s%5$s%4$s, the partner was %3$s%6$s%4$s,%1$s'),
-                          // br, hr, b, /b
-                          'info_capp' => array( 'it' => 'hanno fatto %3$scappotto%4$s EBBRAVI!.%1$s',
-                                                'en' => 'and they made %3Dscapot%4$s WELL DONE!.%1$s'),
-                          // br, hr, b, /b, old_asta_pnt, old_pnt, winornot
-                          'info_alea' => array( 'it' => 'dovevano fare %3$salmeno %5$d%4$s punti e ne hanno fatti %3$s%6$d%4$s: hanno %7$s.%1$s',
-                                                'en' => 'they had to do %3$sat least %5$d%4$s points and they had made %3$s%6$d%4$s: they have %7$s.%1$s'),
-                          // br, hr, b, /b, old_pnt, winornot
-                          'info_more' => array( 'it' => 'dovevano fare %3$spiĆ¹ di 60%4$s punti e ne hanno fatti %3$s%5$d%4$s: hanno %6$s.%1$s',
-                                                'en' => 'they had to do %3$sover 60%4$s points and they had made %3$s%5$d%4$s: they have %3$s%6$s%4$s.%1$s'),
-                          'info_win'  => array( 'it' => 'vinto',
-                                                'en' => 'win'),
-                          'info_peer' => array( 'it' => 'pareggiato',
-                                                'en' => 'drew'),
-                          'info_lost' => array( 'it' => 'perso',
-                                                'en' => 'lost'),
-                          // br, hr, b, /b, win_name
-                          'info_alon' => array( 'it' => '%3$s%5$s%4$s si ĆØ chiamato in mano,%1$s',
-                                                'en' => '%3$s%5$s%4$s play alone against each other,%1$s'),
-                          // br, hr, b, /b, old_asta_pnt, old_pnt, winornot
-                          'info_aleaa' => array( 'it' => 'doveva fare %3$salmeno %5$d%4$s punti e ne ha fatti %3$s%6$d%4$s: ha %3$s%7$s%4$s.%1$s',
-                                                'en' => 'he/she had to do %3$sat least %5$d%4$s points and they had made %3$s%6$d%4$s: he/she had %3$s%7$s%4$s.%1$s'),
-                          // br, hr, b, /b, old_pnt, winornot
-                          'info_morea' => array( 'it' => 'doveva fare %3$spiĆ¹ di 60%4$s punti e ne ha fatti %3$s%5$d%4$s: ha %3$s%6$s%4$s.%1$s',
-                                                 'en' => 'he/she had to do %3$smore than 60%4$s points and they had made %3$s%5$d%4$s: he/she had %3$s%6$s%4$s.%1$s'),
-                          // br, hr, b, /b
-                          'info_acap' => array( 'it' => 'ha fatto %3$scappotto%4$s EBBRAVO!.%1$s',
-                                                'en' => 'and he/she made %3$scapot%4$s WELL DONE!.%1$s'),
-                          // br, hr, b, /b
-                          'info_omul' => array( 'it' => '%1$sLa partita valeva %3$s%5$s%4$s.%1$s',
-                                                'en' => '%1$sEN: The game was worth %3$s%5$s%4$s.%1$s' ),
-                          // br, hr, b, /b
-                          'info_alpa' => array( 'it' => '%1$sHanno passato %3$stutti%4$s.%1$s',
-                                                'en' => '%1$sEN: Hanno passato %3$stutti%4$s.%1$s' ),
-                          // br, hr, b, /b, aband-name
-                          'info_aban' => array( 'it' => ' Ha lasciato %3$s%5$s%4$s perchĆ© aveva al massimo %3$s2 punti%4$s.',
-                                                'en' => ' EN: Ha lasciato %3$s%5$s%4$s perchĆ© aveva al massimo %3$s2 punti%4$s.'),
+                          'info_yshuf'=> array( 'it' => 'Fai <b>tu</b> il mazzo, ',
+                                                'en' => 'It\'s <b>your</b> shuffled the cards, '),
                           'info_shuf' => array( 'it' => 'Il mazzo a <b>%s</b>, ',
                                                 'en' => '<b>%s</b> shuffled the cards, '),
                           'info_yturn'=> array( 'it' => ' tocca a <b>te</b> giocare.',
                                                 'en' => 'it\'s the <b>%s</b>\'s turn.'),
                           'info_mult' => array( 'it' => ' La partita vale <b>%s</b>.',
                                                 'en' => ' The game worth <b>%s</b>.' ),
-                          'info_yshuf'=> array( 'it' => 'Fai <b>tu</b> il mazzo, ',
-                                                'en' => 'It\'s <b>your</b> shuffled the cards, '),
                           'info_match'=> array( 'it' => 'Il codice della partita ĆØ <b>%d</b>.',
                                                 'en' => 'Match code is <b>%d</b>.'),
                           'btn_bkgame'=> array( 'it' => 'torna alla partita',
                                                 'en' => 'back to the game'),
                           'call_wptn' => array( 'it' => '<br>con %d punti',
@@@ -126,6 -81,19 +81,19 @@@ function multoval($mult
          return (sprintf(($G_lang == 'en' ? "%d-ple" : "%d-plo"), $mult));
  }
  
+ function dom_select_rules()
+ {
+     GLOBAL $G_lang;
+     $ret = "<select id='select_rules'>\n";
+     foreach (rules_keys() as $key) {
+         $value = rules_id2descr($key, $G_lang);
+         $ret .= sprintf("<option value='%d'>%s</option>\n", $key, $value);
+     }
+     $ret .= "</select>\n";
+     echo "$ret";
+ }
  
  class Card {
      var $value; /* 0 - 39 card value */
  } // end class Card
  
  class Bin5_table extends Table {
-     var $card;       // il mazzo di carte
-     var $mazzo;      // chi e' di mazzo
-     var $gstart;
-     var $turn;
+     var $card;              // il mazzo di carte
+     var $mazzo;             // chi e' di mazzo
+     var $gstart;            // first player of the current game
+     var $turn;              // turn in the game (absolute, not modularized)
  
-     var $asta_pla;
-     var $asta_pla_n;
-     var $asta_card;
-     var $asta_pnt;
+     var $asta_pla;          // array(); TRUE: in auction, FALSE: out of the auction
+     var $asta_pla_n;        // number of players in auction
+     var $asta_card;         // current card for auction
+     var $asta_pnt;          // current point for auction
  
      var $mult;
-     var $points;    // points array
-     var $points_n;  // number of row of points
+     var $points;            // points array
+     var $points_n;          // number of row of points
      var $total;
  
      var $asta_win;          // the caller idx position at table
      var $briscola;
+     var $tourn_pts;         // points in the caller hand
      var $friend;            // the callee idx position at table
  
      var $match_id;          // the id of the match on the database (-1 == just not saved)
      var $old_asta_win;      // the old caller idx position at table
      var $old_friend;        // the old callee idx position at table
  
+     var $old_tourn_pts;     // the old tournment computed points in the hand of caller
+     var $rules;
      function Bin5_table()
      {
      }
         $thiz->total     =   array( 0, 0, 0, 0, 0);
         $thiz->asta_win  =  -1;
         $thiz->briscola  =  -1;
+        $thiz->tourn_pts =  -1;
         $thiz->friend    =  -1;
         $thiz->turn      =   0;
  
  
         $thiz->asta_win     = $from->asta_win;
         $thiz->briscola     = $from->briscola;
+        $thiz->tourn_pts    = $from->tourn_pts;
         $thiz->friend       = $from->friend;
  
         $thiz->match_id     = $from->match_id;
  
      function spawn(&$from)
      {
+         GLOBAL $G_lang;
          if (($thiz =& new Bin5_table()) == FALSE)
              return (FALSE);
  
  
          $thiz->card = array();
          $thiz->bunch_create();
-         $thiz->mazzo    = rand(0,PLAYERS_N-1);
+         $thiz->mazzo  = rand(0,PLAYERS_N-1);
          $thiz->points = array();
          $thiz->total  = array();
          $thiz->points_n = 0;
          $thiz->old_asta_win = -1;
          $thiz->old_reason = "";
  
+         $rules_name = rules_id2name(BIN5_TOURNAMENT_CURRENT);
+         $thiz->rules = new $rules_name($thiz);
          // players are rearranged in an dedicated array
          $thiz->player = array();
          for ($i = 0 ; $i < $from->player_n ; $i++)
          return ($thiz);
      }
  
-     static function asta2mult($asta_pnt)
-     {
-         if ($asta_pnt > 110)
-             return (6);
-         else if ($asta_pnt > 100)
-             return (5);
-         else if ($asta_pnt > 90)
-             return (4);
-         else if ($asta_pnt > 80)
-             return (3);
-         else if ($asta_pnt > 70)
-             return (2);
-         else
-             return (1);
-     }
-     function multer($is_new)
-     {
-         if ($is_new) {
-             return (static::s_multer($this->mult, $this->asta_pnt));
-         }
-         else {
-             return (static::s_multer($this->old_mult, $this->old_asta_pnt));
-         }
-     }
-     static function s_multer($mult, $pnt)
-     {
-         return (pow(2, $mult) * static::asta2mult($pnt));
-     }
-     static function s_point_calc($pnt_done, $mult, $pnt_req, $is_allpoints)
-     {
-         return ($pnt_done * static::s_multer($mult, $pnt_req) * ($is_allpoints ? 2 : 1));
-     }
  
      //   function bunch_create_old() function AND
      //   {
          $this->asta_pnt  = 60;
          $this->asta_win  = -1;
          $this->briscola  = -1;
+         $this->tourn_pts = -1;
          $this->friend    = -1;
          $this->turn      =  0;
  
              $user_cur->asta_card = -2;
              $user_cur->asta_pnt  = -1;
              $user_cur->handpt = $this->hand_points($i);
+             $this->rules->tourn_points($user_cur, $i);
          }
          log_rd2("GEND 4");
      }
          return ($ct);
      }
  
-     function rules_engine(&$bri, $curtime, $action, $user)
-     {
-         GLOBAL $G_all_points, $G_dbasetype;
-         $pnts_sav = array();
-         if ($action == BIN5_RULES_ALLPASS) { // return TRUE if all correct
-             $this->old_act = $action;
-             $this->old_asta_win = -1;
-             $this->old_pnt = 0;
-             $this->mult_inc(1);
-             for ($i = 0 ; $i < PLAYERS_N ; $i++) {
-                 $pnts_sav[$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
-             if (!($user->handpt <= 2)) {
-                 return (FALSE);
-             }
-             $this->old_act = $action;
-             log_wr(sprintf("GIOCO FINITO !!!"));
-             $this->old_asta_win = $user->table_pos;
-             $this->old_pnt = 0;
-             $this->mult_inc(1);
-             for ($i = 0 ; $i < PLAYERS_N ; $i++) {
-                 $pnts_sav[$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
-             $this->old_act = $action;
-             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_CARD_HAND * BIN5_PLAYERS_N) ; $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 (game_result($this->asta_pnt, $pro) == 0) {
-                     $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;
-                         $pnts_sav[$i] = 0;
-                     }
-                     $this->points_n++;
-                     $this->old_pnt = $pro;
-                     $this->old_asta_win = $this->asta_win;
-                     $this->mult_inc(1);
-                     break;
-                 }
-                 if ($pro >= $this->asta_pnt)
-                     $sig = 1;
-                 else
-                     $sig = -1;
-                 // TAG: POINTS_MANAGEMENT
-                 $this->points[$this->points_n % MAX_POINTS] = array();
-                 for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-                     if ($i == $this->asta_win)
-                         $pnt = ($i == $this->friend ? 4 : 2);
-                     else if ($i == $this->friend)
-                         $pnt = 1;
-                     else
-                         $pnt = -1;
-                     log_wr(sprintf("PRO: pt[%d][%d] = %d", $this->points_n % MAX_POINTS, $i, $pnt));
-                     $pnt_sav = static::s_point_calc($pnt * $sig,           0, $this->asta_pnt, ($pro == 120));
-                     $pnt_tab = static::s_point_calc($pnt * $sig, $this->mult, $this->asta_pnt, ($pro == 120));
-                     $this->points[$this->points_n % MAX_POINTS][$i] = $pnt_tab;
-                     $this->total[$i] += $pnt_tab;
-                     $pnts_sav[$i] = $pnt_sav;
-                 }
-                 $this->points_n++;
-                 $this->old_pnt = $pro;
-                 $this->old_asta_win = $this->asta_win;
-                 $this->mult_set(0);
-             } 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).'|'.$pnts_sav[$i];
-             $codes .= '|'.xcapelt($user_cur->code_get());
-         }
-         $plist .= $codes;
-         log_legal($curtime, $user->ip, $user, "STAT:BRISKIN5:FINISH_GAME", $plist);
-         $this->old_asta_pnt = $this->asta_pnt;
-         // $this->old_mazzo is managed by ->game_next();
-         // $this->old_mult, $this->old_pnt, $this->old_reason and $this->old_asta_win are specific
-         $this->old_friend = $this->friend;
-         $this->old_reason = game_description($action, 'html', $this->old_mult,
-                                              $this->old_asta_win,
-                                              ($this->old_asta_win != -1 ?
-                                               $bri->user[$this->player[$this->old_asta_win]]->name : ""),
-                                              $this->old_friend,
-                                              ($this->old_friend != -1 ?
-                                               $bri->user[$this->player[$this->old_friend]]->name : ""),
-                                              $this->old_pnt, $this->old_asta_pnt);
-         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, $action, $ucodes, $pnts_sav);
-                 unset($bdb);
-             }
-             else {
-                 log_points($user->ip, $curtime, $user, "STAT:BRISKIN5:FINISH_GAME", "DATABASE CONNECTION FAILED");
-             }
-             log_points($user->ip, $curtime, $user, "STAT:BRISKIN5:FINISH_GAME", $plist);
-         }
-         $this->game_init($bri->user);
-         return (TRUE);
-     }
      function match_continue(&$bri, $user, $match_id_s)
      {
+         //
+         //  Rules: update version following loaded tcode
+         //
          $ret = FALSE;
          $curtime = time();
  
          do {
+             if ($this->match_id != -1) {
+                 $msg = sprintf("Stai giĆ  giocando la partita con codice %d.", $this->match_id);
+                 break;
+             }
              /* - verify if match_id and user are both valid to accept
                 the match_continue request - */
              $match_id = (int)$match_id_s;
                  break;
              }
  
-             if ($user->continue_get() == BIN5_USER_CONTINUE_ALREADY) {
-                 $msg = "Hai giĆ  richiesto di continuare una partita.";
-                 break;
-             }
              if ($user->continue_get() == $match_id) {
                  $msg = "Hai giĆ  richiesto di continuare questa partita.";
                  break;
              /* - the user is in the list, add the match_id to his profile
                 and check if he is the N'th to require continue - */
  
-             // set the match_id for the current user
-             $user->continue_set($match_id);
+             $continue_tot = 0;
              for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                  $user_cur = &$bri->user[$this->player[$i]];
-                 if ($user_cur->continue_get() != $match_id) {
-                     break;
+                 if ($user == $user_cur) {
+                     $continue_tot += 1;
+                     continue;
                  }
+                 if ($user_cur->continue_get() == BIN5_USER_CONTINUE_INIT)
+                     continue;
+                 if ($user_cur->continue_get() != $match_id)
+                     break;
+                 $continue_tot += 1;
              }
+             if ($i < BIN5_PLAYERS_N) {
+                 $msg = sprintf("<b>L'utente <i>%s</i> voleva giĆ  continuare la partita nĀ° %d.</b>",
+                                xcape($user_cur->name), $user_cur->continue_get());
+                 break;
+             }
+             // set the match_id for the current user
+             $user->continue_set($match_id);
              $ret = TRUE;
              // not all players set the continue match than we exit
-             if ($i < BIN5_PLAYERS_N) {
+             if ($continue_tot < BIN5_PLAYERS_N) {
                  $msg = sprintf("<b>L'utente <i>%s</i> vorrebbe continuare la partita nĀ° %d.</b>",
                                 xcape($user->name), $match_id);
                  break;
                  unset($bdb);
              }
  
+             /* update rules engine */
+             $rules_name = rules_id2name($match_data['tcode']);
+             $this->rules = new $rules_name($this);
              /* bunch and multiplier status set */
              $this->mazzo = $match_data['mazzo_next'];
              $this->mult  = $match_data['mult_next'];
              $this->match_id = $match_id;
 -            $this->game_init(&$bri->user);
 +            $this->game_init($bri->user);
  
              /* reload of the page with the new layout */
              for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                  $user_cur = &$bri->user[$this->player[$i]];
-                 $user_cur->continue_set(BIN5_USER_CONTINUE_ALREADY);
  
                  $user_cur->trans_step = $user_cur->step + 1;
                  $user_cur->comm[$user_cur->step % COMM_N] = sprintf('gst.st_loc++; gst.st=%d; xstm.stop(); window.onunload = null ; window.onbeforeunload = null ; document.location.assign("index.php");|', $user_cur->step+1);
                  $user_cur->comm[$user_cur->step % COMM_N] = "";
                  $user_cur->step_inc();
  
 -                $user_cur->comm[$user_cur->step % COMM_N] = show_table(&$bri, &$user_cur, $user_cur->step+1, TRUE, FALSE);
 +                $user_cur->comm[$user_cur->step % COMM_N] = show_table($bri, $user_cur, $user_cur->step+1, TRUE, FALSE);
                  $user_cur->step_inc();
              }
              return (TRUE);
          }
      }
  
+     function rules_change(&$bri, $user, $rules_id_s)
+     {
+         GLOBAL $G_lang;
+         //
+         //  Rules: update version following loaded tcode
+         //
+         $ret = FALSE;
+         $curtime = time();
+         do {
+             if ($this->match_id != -1) {
+                 // FIXME_LANG
+                 $msg = sprintf("Stai giĆ  giocando la partita con codice %d.", $this->match_id);
+                 break;
+             }
+             if ($this->asta_card != -1 || $this->asta_pla_n < BIN5_PLAYERS_N) {
+                 // FIXME_LANG
+                 $msg = sprintf("La partita ĆØ giĆ  stata avviata.");
+                 break;
+             }
+             $rules_id = (int)$rules_id_s;
+             if (! in_array($rules_id, rules_keys())) {
+                 // FIXME_LANG
+                 $msg = "queste regole non esistono o non sono attive";
+                 break;
+             }
+             if ($user->rules_get() == $rules_id) {
+                 // FIXME_LANG
+                 $msg = "hai giĆ  richiesto di usare queste regole";
+                 break;
+             }
+             /* - the user is in the list, add the match_id to his profile
+                and check if he is the N'th to require continue - */
+             $rules_tot = 0;
+             for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                 $user_cur = &$bri->user[$this->player[$i]];
+                 if ($user == $user_cur) {
+                     $rules_tot += 1;
+                     continue;
+                 }
+                 if ($user_cur->rules_get() == BIN5_USER_CONTINUE_INIT)
+                     continue;
+                 if ($user_cur->rules_get() != $rules_id)
+                     break;
+                 $rules_tot += 1;
+             }
+             if ($i < BIN5_PLAYERS_N) {
+                 // FIXME_LANG
+                 $msg = sprintf("<b>L'utente <i>%s</i> voleva giĆ  usare le %s.</b>",
+                                xcape($user_cur->name), xcape(rules_id2descr($user_cur->rules_get(), $G_lang)));
+                 break;
+             }
+             // set the match_id for the current user
+             $user->rules_set($rules_id);
+             $ret = TRUE;
+             // not all players set the continue match than we exit
+             if ($rules_tot < BIN5_PLAYERS_N) {
+                 // FIXME_LANG
+                 $msg = sprintf("<b>L'utente <i>%s</i> vorrebbe usare le %s.</b>",
+                                xcape($user->name), xcape(rules_id2descr($rules_id, $G_lang)));
+                 break;
+             }
+             /* - all users decide to continue the same match, update all infos and rearrange users
+                to the right positions on the table - */
+             /* update rules engine */
+             $rules_name = rules_id2name($rules_id);
+             $this->rules = new $rules_name($this);
+             // $this->game_init(&$bri->user);
+             /* reload of the page with the new layout */
+             for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                 $user_cur = &$bri->user[$this->player[$i]];
+                 $this->rules->tourn_points($user_cur, $i);
+                 $user_cur->rules_set(BIN5_USER_CONTINUE_INIT);
+                 $user_cur->trans_step = $user_cur->step + 1;
+                 $user_cur->comm[$user_cur->step % COMM_N] = sprintf('gst.st_loc++; gst.st=%d; xstm.stop(); window.onunload = null ; window.onbeforeunload = null ; document.location.assign("index.php");|', $user_cur->step+1);
+                 $user_cur->step_inc();
+                 // a void command force xynt-streamer to flush all data to client
+                 $user_cur->trans_step = $user_cur->step + 1;
+                 $user_cur->comm[$user_cur->step % COMM_N] = "";
+                 $user_cur->step_inc();
+                 $user_cur->comm[$user_cur->step % COMM_N] = show_table(&$bri, &$user_cur, $user_cur->step+1, TRUE, FALSE);
+                 $user_cur->step_inc();
+             }
+             return (TRUE);
+         } while (FALSE);
+         $dt = date("H:i ", $curtime);
+         if ($ret == TRUE) {
+             for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                 $user_cur = &$bri->user[$this->player[$i]];
+                 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
+                 $user_cur->comm[$user_cur->step % COMM_N] .= nickserv_msg($dt, $msg);
+                 $user_cur->step_inc();
+             }
+         }
+         else {
+             $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
+             $user->comm[$user->step % COMM_N] = xcape(sprintf("rules_set(%d);",
+                                                               $this->rules->id));
+             $user->comm[$user->step % COMM_N] .= nickserv_msg($dt, $msg);
+             $user->step_inc();
+         }
+     } // end function rules_change
  } // end class Bin5_table
  
  
  
  define('BIN5_USER_FLAG_RING_ENDAUCT', 0x01);
  define('BIN5_USER_CONTINUE_INIT', -1);
- define('BIN5_USER_CONTINUE_ALREADY', -2);
+ define('BIN5_USER_RULES_INIT', -1);
  class Bin5_user extends User {
      var $asta_card;  //
      var $asta_pnt;   //
      var $privflags;  // Flags for briskin5 only
  
      var $continue;   // Id of the match that the user would continue
+     var $rules;      // Id of rules required by user
+     var $asta_tourn_pts;    // array with tournment points for each suit
  
      const BASE = "../";
  
         $thiz->exitislock = TRUE;
         $thiz->privflags = 0;
         $thiz->continue = BIN5_USER_CONTINUE_INIT;
+        $thiz->rules = BIN5_USER_RULES_INIT;
  
         return ($thiz);
         }
          $this->exitislock = $from->exitislock;
          $this->privflags  = $from->privflags;
          $this->continue   = $from->continue;
+         $this->rules      = $from->rules;
      }
  
      /* CLONE NOT USED
          $thiz->handpt     = -1;
          $thiz->exitislock = TRUE;
          $thiz->continue   = BIN5_USER_CONTINUE_INIT;
+         $thiz->rules      = BIN5_USER_RULES_INIT;
  
          log_wr("Bin5 constructor");
  
                log_load("RESYNC");
                /* NOTE: $this->room is associated with the current $bri object */
                printf("xXx CLASS NAME [%s]\n", get_class($this->room));
 -              $ret = show_table(&$this->room, $this, $this->step, FALSE, FALSE);
 +              $ret = show_table($this->room, $this, $this->step, FALSE, FALSE);
            }
            log_rd2("NEWSTAT: ".$this->stat);
  
          return ($this->continue);
      }
  
+     function rules_set($rules_id)
+     {
+         $this->rules = $rules_id;
+     }
+     function rules_get() {
+         return ($this->rules);
+     }
  } // end class Bin5_user
  
  
@@@ -1172,7 -1117,7 +1117,7 @@@ class Bin5 
              $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);
 +        $this->table[0] = Bin5_table::spawn($table);
  
          log_main("TABLE_OLD_WIN - Bin5:".$this->table[0]->old_asta_win);
  
                          $user_cur->the_end = TRUE;
  
                          /* se gli altri utenti non erano d'accordo questo utente viene bannato */
 -                        $remcalc = $this->table[0]->exitlock_calc(&$this->user, $user_cur->table_pos);
 +                        $remcalc = $this->table[0]->exitlock_calc($this->user, $user_cur->table_pos);
                          if ($remcalc < 3) {
                              require_once("${G_base}Obj/hardban.phh");
                              Hardbans::add(($user_cur->is_auth() ? $user_cur->name : FALSE),
              $match_id = substr($user_mesg, 6);
              $table->match_continue($this, $user, $match_id);
          }
+         else if (strncmp($user_mesg, "/rules ", 7) == 0) {
+             log_main($user->sess." chatt_send BEGIN");
+             $rules_id = substr($user_mesg, 7);
+             $table->rules_change($this, $user, $rules_id);
+         }
          else {
              for ($i = 0 ; $i < ($user->stat == 'room' ? BIN5_MAX_PLAYERS : BIN5_PLAYERS_N) ; $i++) {
                  if ($user->stat == 'room') {
          case "":
          case "index.php":
              ob_start();
 -            bin5_index_main($transp_type, $header_out, $addr, $get, $post, $cookie);
 +            bin5_index_main($transp_type, $header, $header_out, $addr, $get, $post, $cookie);
              $content = ob_get_contents();
              ob_end_clean();
  
  
              break;
          case "index_rd.php":
 +        case "index_rd_wss.php":
              if (($transp  = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
                  $transp = "iframe";
 -            if ($transp == 'websocket')
 +            if ($transp == 'websocket' || $transp == 'websocketsec')
                  $enc = 'plain';
  
              do {
@@@ -1610,11 -1560,13 +1561,13 @@@ function show_table(&$bri, &$user, $sen
      $table_pos = $user->table_pos;
  
      $ret = "table_init();";
 -    $ret .= $table->exitlock_show(&$bri->user, $table_pos);
 +    $ret .= $table->exitlock_show($bri->user, $table_pos);
      if (!$is_again) {
          /* GENERAL STATUS */
-         $ret .= sprintf( 'gst.st = %d; stat = "%s"; subst = "%s"; table_pos = %d;',
-                          $sendstep, $user->stat, $user->subst, $table_pos);
+         $user_rules = $user->rules_get();
+         $ret .= sprintf('gst.st = %d; stat = "%s"; subst = "%s"; table_pos = %d; rules_set(%d);',
+                         $sendstep, $user->stat, $user->subst, $table_pos,
+                         ($user_rules == BIN5_USER_CONTINUE_INIT ? $table->rules->id_get() : $user_rules));
  
          log_rd(sprintf( 'SHOW_TABLE: gst.st = %d; stat = "%s"; subst = "%s"; table_pos = %d;', $sendstep, $user->stat, $user->subst, $table_pos));
  
      }
      /* NOTIFY FOR THE CARD MAKER */
      if ($is_transition) { //  && $user->subst ==  "asta" superfluo
 -        $ret .= show_table_info(&$bri, &$table, $table_pos);
 +        $ret .= show_table_info($bri, $table, $table_pos);
          $ret .= "setTimeout(preload_images, 500, g_preload_img_arr, g_imgct);";
      }
      else {
      if (!$is_again)
          $ret .= table_welcome($user);
  
-     if ($is_transition && !$is_again) { // appena seduti al tavolo, play della mucca
+     if ($is_transition && !$is_again) { // just sit, play cow
          $ret .= playsound("cow.mp3");
      }
  
                              $table->asta_card);
          }
          else {
+             // FIXME - RULES to be able to abandon table
              /* show auction */
              if ($table_pos == ($table->gstart % BIN5_PLAYERS_N) &&
                  $table->asta_win == -1)
@@@ -1848,7 -1801,8 +1802,8 @@@ function show_table_info(&$bri, &$table
  
      // TAG: POINTS_MANAGEMENT
      $pnt_min = $table->points_n - MAX_POINTS < 0 ? 0 : $table->points_n - MAX_POINTS;
-     $noty = sprintf('<table class=\"points\"><tr><th></th>');
+     $noty = sprintf('<p>%s.</p>\n', xcape(ucfirst(rules_id2descr($table->rules->id_get(), $G_lang))));
+     $noty .= sprintf('<table class=\"points\"><tr><th></th>');
  
      // Names.
      for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++)
          $noty .= sprintf($mlang_bin5_bin5['info_turn'][$G_lang], $unam);
      }
  
-     $multer = $table->multer(TRUE);
+     $multer = $table->rules->multer(TRUE);
      if ($multer > 1) {
          $noty .= sprintf($mlang_bin5_bin5['info_mult'][$G_lang], multoval($multer) );
      }
@@@ -1973,26 -1927,6 +1928,6 @@@ function briscola_show($bri, $table, $u
      return ($ret);
  }
  
- function game_result($asta_pnt, $pnt)
- {
-     $sixty = 60;
-     if ($asta_pnt == 61) {
-         if ($pnt > $sixty)
-             return (1);
-         else if ($pnt == $sixty)
-             return (0);
-         else
-             return (-1);
-     }
-     else {
-         if ($pnt >= $asta_pnt)
-             return (1);
-         else
-             return (-1);
-     }
- }
  function log_points($remote_addr, $curtime, $user, $where, $mesg)
  {
      if (($fp = @fopen(LEGAL_PATH."/points.log", 'a')) != FALSE) {
      }
  }
  
- function game_description($act, $form, $old_mult, $win = -1, $win_name = "?1?", $fri = -1, $fri_name = "?2?",
-                           $old_pnt = -1, $old_asta_pnt = -1)
- {
-     GLOBAL $G_lang, $mlang_bin5_bin5;
-     if ($form == 'html') {
-         $tg_br = "<br>";
-         $tg_hr = "<hr>";
-         $tg_bo = "<b>";
-         $tg_bc = "</b>";
-         $win_name = xcape($win_name);
-         $fri_name = xcape($fri_name);
-     }
-     else {
-         $tg_br = " ";
-         $tg_hr = " ";
-         $tg_bo = "";
-         $tg_bc = "";
-     }
-     if ($act == BIN5_RULES_OLDSCHEMA) {
-         return ("");
-     }
-     else if ($act == BIN5_RULES_ALLPASS) {
-         return (sprintf($mlang_bin5_bin5['info_alpa'][$G_lang],
-                         $tg_br, $tg_hr, $tg_bo, $tg_bc));
-     }
-     else if ($act == BIN5_RULES_ABANDON) {
-         return (sprintf($mlang_bin5_bin5['info_aban'][$G_lang],
-                         $tg_br, $tg_hr, $tg_bo, $tg_bc,
-                         $win_name));
-     }
-     else {
-         $wol = game_result($old_asta_pnt, $old_pnt);
-         $noty = "";
-         if ($win != $fri) { // not alone case
-             /* 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],
-                              $tg_br, $tg_hr, $tg_bo, $tg_bc,
-                              $win_name,
-                              $fri_name);
-             if ($old_pnt == 120) {
-                 $noty .= sprintf($mlang_bin5_bin5['info_capp'][$G_lang],
-                                  $tg_br, $tg_hr, $tg_bo, $tg_bc );
-             }
-             else {
-                 if ($old_asta_pnt > 61) {
-                     $noty .= sprintf($mlang_bin5_bin5['info_alea'][$G_lang],
-                                      $tg_br, $tg_hr, $tg_bo, $tg_bc,
-                                      $old_asta_pnt, $old_pnt,
-                                      ($wol == 1 ? $mlang_bin5_bin5['info_win'][$G_lang] :
-                                       ($wol == 0 ? $mlang_bin5_bin5['info_peer'][$G_lang] :
-                                        $mlang_bin5_bin5['info_lost'][$G_lang])));
-                 }
-                 else {
-                     $noty .= sprintf($mlang_bin5_bin5['info_more'][$G_lang],
-                                      $tg_br, $tg_hr, $tg_bo, $tg_bc,
-                                      $old_pnt,
-                                      ($wol == 1 ? $mlang_bin5_bin5['info_win'][$G_lang] :
-                                       ($wol == 0 ? $mlang_bin5_bin5['info_peer'][$G_lang] :
-                                        $mlang_bin5_bin5['info_lost'][$G_lang])));
-                 } // else of if ($old_asta_pnt > 61) {
-             } // else of if ($old_pnt == 120) {
-         } // if ($win != $fri) { // not alone case
-         else {
-             $noty .= sprintf($mlang_bin5_bin5['info_alon'][$G_lang],
-                              $tg_br, $tg_hr, $tg_bo, $tg_bc,
-                              $win_name);
-             if ($old_pnt == 120) {
-                 $noty .= sprintf($mlang_bin5_bin5['info_acap'][$G_lang],
-                                  $tg_br, $tg_hr, $tg_bo, $tg_bc);
-             }
-             else {
-                 if ($old_asta_pnt > 61) {
-                     $noty .= sprintf($mlang_bin5_bin5['info_aleaa'][$G_lang],
-                                      $tg_br, $tg_hr, $tg_bo, $tg_bc,
-                                      $old_asta_pnt, $old_pnt,
-                                      ($wol == 1 ? $mlang_bin5_bin5['info_win'][$G_lang] :
-                                       ($wol == 0 ? $mlang_bin5_bin5['info_peer'][$G_lang] :
-                                        $mlang_bin5_bin5['info_lost'][$G_lang])));
-                 }
-                 else {
-                     $noty .= sprintf($mlang_bin5_bin5['info_morea'][$G_lang],
-                                      $tg_br, $tg_hr, $tg_bo, $tg_bc,
-                                      $old_pnt,
-                                      ($wol == 1 ? $mlang_bin5_bin5['info_win'][$G_lang] :
-                                       ($wol == 0 ? $mlang_bin5_bin5['info_peer'][$G_lang] :
-                                        $mlang_bin5_bin5['info_lost'][$G_lang])));
-                 }
-             }
-         }
-     }
-     $old_multer = Bin5_table::s_multer($old_mult, $old_asta_pnt);
-     if ($old_multer > 1) {
-         $noty .= sprintf($mlang_bin5_bin5['info_omul'][$G_lang],
-                          $tg_br, $tg_hr, $tg_bo, $tg_bc,
-                          multoval($old_multer));
-     }
-     $noty .= sprintf('%2$s', $tg_br, $tg_hr);
-     return ($noty);
- }
  
  ?>
diff --combined web/briskin5/index.php
@@@ -46,13 -46,9 +46,13 @@@ $mlang_bin5_index = array( 'aucwin' => 
                             );
  
  
 -function bin5_index_main($transp_type, &$header_out, $addr, $get, $post, $cookie)
 +function bin5_index_main($transp_type, $header, &$header_out, $addr, $get, $post, $cookie)
  {
      GLOBAL $G_lang, $mlang_bin5_index;
 +
 +    $transp_port = ((array_key_exists("X-Forwarded-Proto", $header) &&
 +                     $header["X-Forwarded-Proto"] == "https") ? 443 : 80);
 +
      if (($table_idx = gpcs_var('table_idx', $get, $post, $cookie)) === FALSE)
          unset ($table_idx);
      if (($laststate = gpcs_var('laststate', $get, $post, $cookie)) === FALSE)
@@@ -114,13 -110,15 +114,15 @@@ window.onload = function() 
    preferences_update();
  
    sess = "<?php echo "$sess"; ?>";
 -  xstm = new xynt_streaming(window, "<?php echo "$transp_type"; ?>", 80, 2, null /* console */, gst, 'table_php', 'sess', sess, $('sandbox'), 'index_rd.php', function(com){eval(com);});
 +  xstm = new xynt_streaming(window, <?php printf("\"%s\", %d", $transp_type, $transp_port); ?>,  2, null /* console */, gst, 'table_php', 'sess', sess, $('sandbox'), 'index_rd.php', function(com){eval(com);});
    xstm.hbit_set(heartbit);
    
    window.onbeforeunload = onbeforeunload_cb;  
    window.onunload = onunload_cb;  
  
    xstm.start();
+   addEvent($('select_rules'), "change", function() { act_select_rules(this.value); } );
    // FIXME: add this setTimeout(preload_images into data stream to avoid
    // race on opened socket
    // setTimeout(preload_images, 0, g_preload_img_arr, g_imgct);
  <div style="width: 95%; /* background-color: red; */ margin: auto; text-align: left;">
  <br><br>
  <input type="checkbox" name="pref_ring_endauct" id="pref_ring_endauct" onclick="pref_ring_endauct_set(this);"><?php echo $mlang_bin5_index['itm_ringauc'][$G_lang] ?>
+     <div>
+         <label>Regole:</label><?php dom_select_rules();?>
+     </div>
  </div>
  
  
@@@ -34,6 -34,7 +34,7 @@@ require_once("Obj/briskin5.phh")
  function bin5_index_wr_main(&$bin5, $remote_addr_full, $get, $post, $cookie)
  {
      GLOBAL $G_base, $G_dbasetype, $G_ban_list, $G_black_list;
+     GLOBAL $mlang_indwr, $G_lang;
  
      $remote_addr = addrtoipv4($remote_addr_full);
  
  
      log_wr('COMM: '.$mesg);
  
      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 = &$bin5->get_user($sess, &$idx)) == FALSE) {
 +    if (($user = &$bin5->get_user($sess, $idx)) == FALSE) {
          echo "Get User Error";
          log_wr("Get User Error");
          return FALSE;
          if ($argz[0] == 'tableinfo') {
              log_wr("PER DI TABLEINFO");
              $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
 -            $user->comm[$user->step % COMM_N] .= show_table_info(&$bin5, &$table, $user->table_pos);
 +            $user->comm[$user->step % COMM_N] .= show_table_info($bin5, $table, $user->table_pos);
              log_wr($user->comm[$user->step % COMM_N]);
              $user->step_inc();
          }
          else if ($argz[0] == 'chatt') {
 -            $bin5->chatt_send(&$user, $mesg);
 +            $bin5->chatt_send($user, $mesg);
          }
          else if ($argz[0] == 'preferences_update') {
              log_wr("PER DI PREFERENCES_UPDATE");
  
              $logout_cont = TRUE;
              if ($remcalc >= 3) {
 -                $lockcalc = $table->exitlock_calc(&$bin5->user, $user->table_pos);
 +                $lockcalc = $table->exitlock_calc($bin5->user, $user->table_pos);
                  if ($lockcalc < 3) {
                      $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
 -                    $user->comm[$user->step % COMM_N] .= $table->exitlock_show(&$bin5->user, $user->table_pos);
 +                    $user->comm[$user->step % COMM_N] .= $table->exitlock_show($bin5->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]);
          }
          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(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(&$bin5->user); */
-                 if ($table->rules_engine($bin5, $curtime, BIN5_RULES_ABANDON, $user)) {
 -                if ($table->rules->engine(&$bin5, $curtime, BIN5_RULES_ABANDON, $user)) {
++                if ($table->rules->engine($bin5, $curtime, BIN5_RULES_ABANDON, $user)) {
                      for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                          $user_cur = &$bin5->user[$table->player[$i]];
  
                          $ret = sprintf('gst.st = %d;', $user_cur->step+1);
 -                        $ret .= show_table(&$bin5,&$user_cur,$user_cur->step+1, TRUE, TRUE);
 +                        $ret .= show_table($bin5, $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;
+                 $success = FALSE;
                  $index_cur = $table->gstart % BIN5_PLAYERS_N;
-                 if ($user->table_pos == $index_cur &&
-                     $table->asta_pla[$index_cur]) {
+                 do {
+                     $ret_s = '';
+                     if ($user->table_pos != $index_cur ||
+                         !$table->asta_pla[$index_cur]) {
+                         // FIXME_LANG
+                         $ret_s = 'grave inconsistenza';
+                         break;
+                     }
                      $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.");
-                         $table->asta_pla[$index_cur] = FALSE;
-                         $user->asta_card  = -1;
-                         $table->asta_pla_n--;
-                         $again = FALSE;
-                     }
-                     else if ($a_card <= 9) {
-                         if ($a_card >= 0 && $a_card < 9 && $a_card > $table->asta_card)
-                             $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;
-                             $table->asta_card = $a_card;
-                             if ($a_card == 9) {
-                                 $user->asta_pnt   = $a_pnt;
-                                 $table->asta_pnt  = $a_pnt;
-                             }
-                         }
+                     /* user action management */
+                     if (!$table->rules->engine(&$bin5, $curtime, BIN5_RULES_ASTA, $user,
+                                                $ret_s, $a_card, $a_pnt)) {
+                         break;
                      }
  
-                     if ($again) { // Qualcosa non andato bene, rifare
-                         $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();
+                     /* next step */
+                     $showst = "show_astat(";
+                     for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                         $user_cur = &$bin5->user[$table->player[$i]];
+                         $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 .= ");";
  
-                         log_wr("Ripetere.");
+                     $maxcard = -2;
+                     for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                         $user_cur = &$bin5->user[$table->player[$i]];
+                         if ($maxcard < $user_cur->asta_card)
+                             $maxcard = $user_cur->asta_card;
                      }
-                     else {
-                         /* next step */
-                         $showst = "show_astat(";
-                         for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-                             $user_cur = &$bin5->user[$table->player[$i]];
-                             $showst .= sprintf("%s%d", ($i == 0 ? "" : ", "),
-                                                ($user_cur->asta_card < 9 ? $user_cur->asta_card : $user_cur->asta_pnt));
+                     /*
+                      *  IF not max points AND
+                      *  (asta_pla_n > 1 if someone bet OR
+                      *   asta_pla_n > 0 if someone NOT bet)
+                      *  THEN advance auction
+                      */
+                     if ($table->rules->engine(&$bin5, $curtime, BIN5_RULES_NEXTAUCT, $user, $maxcard)) {
+                         /* search the next player in auction and put it in gstart field */
+                         for ($i = 1 ; $i < BIN5_PLAYERS_N ; $i++) {
+                             $index_next = ($table->gstart + $i) % BIN5_PLAYERS_N;
+                             if ($table->asta_pla[$index_next]) {
+                                 log_wr("GSTART 1");
+                                 $table->gstart += $i;
+                                 break;
+                             }
                          }
-                         if (BIN5_PLAYERS_N == 3)
-                             $showst .= ",-2,-2";
-                         $showst .= ");";
  
-                         $maxcard = -2;
+                         /* set client side view */
                          for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                              $user_cur = &$bin5->user[$table->player[$i]];
-                             if ($maxcard < $user_cur->asta_card)
-                                 $maxcard = $user_cur->asta_card;
+                             $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();',
+                                                 $table->asta_card + 1, $table->asta_pnt+1, ($user_cur->handpt <= 2 ? "true" : "false"));
+                             else
+                                 $ret .= sprintf('dispose_asta(%d,%d, %s); remark_off();',
+                                                 $table->asta_card + 1, -($table->asta_pnt+1), ($user_cur->handpt <= 2 ? "true" : "false"));
+                             $user_cur->comm[$user_cur->step % COMM_N] = $ret;
+                             $user_cur->step_inc();
                          }
+                     }
+                     else if ($table->asta_pla_n == 0) {
+                         log_wr("PASSANO TUTTI!");
  
-                         if (($table->asta_pla_n > ($maxcard > -1 ? 1 : 0)) &&
-                             !($table->asta_card == 9 && $table->asta_pnt == 120)) {
-                             log_wr("ALLOPPA QUI");
-                             for ($i = 1 ; $i < BIN5_PLAYERS_N ; $i++) {
-                                 $index_next = ($table->gstart + $i) % BIN5_PLAYERS_N;
-                                 if ($table->asta_pla[$index_next]) {
-                                     log_wr("GSTART 1");
-                                     $table->gstart += $i;
-                                     break;
-                                 }
-                             }
+                         if ($table->rules->engine(&$bin5, $curtime, BIN5_RULES_ALLPASS, $user)) {
                              for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                                  $user_cur = &$bin5->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();',
-                                                     $table->asta_card + 1, $table->asta_pnt+1, ($user_cur->handpt <= 2 ? "true" : "false"));
-                                 else
-                                     $ret .= sprintf('dispose_asta(%d,%d, %s); remark_off();',
-                                                     $table->asta_card + 1, -($table->asta_pnt+1), ($user_cur->handpt <= 2 ? "true" : "false"));
+                                 $ret = sprintf('gst.st = %d;', $user_cur->step+1);
+                                 $ret .= show_table(&$bin5,&$user_cur,$user_cur->step+1, TRUE, TRUE);
                                  $user_cur->comm[$user_cur->step % COMM_N] = $ret;
                                  $user_cur->step_inc();
                              }
                          }
-                         else if ($table->asta_pla_n == 0) {
-                             log_wr("PASSANO TUTTI!");
-                             if ($table->rules_engine($bin5, $curtime, BIN5_RULES_ALLPASS, $user)) {
-                                 for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-                                     $user_cur = &$bin5->user[$table->player[$i]];
-                                     $ret = sprintf('gst.st = %d;', $user_cur->step+1);
-                                     $ret .= show_table($bin5, $user_cur,$user_cur->step+1, TRUE, TRUE);
-                                     $user_cur->comm[$user_cur->step % COMM_N] = $ret;
-                                     $user_cur->step_inc();
-                                 }
-                             }
+                     }
+                     else {
+                         log_wr("FINITA !");
+                         // 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++)
+                                 if ($i != $chooser)
+                                     $table->asta_pla[$i] = FALSE;
                          }
                          else {
-                             log_wr("FINITA !");
-                             // 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++)
-                                     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->step+1, $table->asta_card + 1,-($table->asta_pnt));
-                                   $user->step_inc();
-                                 */
-                                 for ($i = 1 ; $i < BIN5_PLAYERS_N ; $i++) {
-                                     $chooser = ($table->gstart + $i) % BIN5_PLAYERS_N;
-                                     if ($table->asta_pla[$chooser]) {
-                                         break;
-                                     }
+                             /*
+                               $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();
+                             */
+                             for ($i = 1 ; $i < BIN5_PLAYERS_N ; $i++) {
+                                 $chooser = ($table->gstart + $i) % BIN5_PLAYERS_N;
+                                 if ($table->asta_pla[$chooser]) {
+                                     break;
                                  }
                              }
-                             $table->asta_win = $chooser;
-                             for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-                                 $user_cur = &$bin5->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));
+                         }
+                         $table->asta_win = $chooser;
  
-                                 if ($i == $chooser) {
-                                     $ret .= "choose_seed(". $table->asta_card."); remark_on();";
-                                 }
-                                 else {
-                                     $ret .= "remark_off();";
-                                 }
+                         for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                             $user_cur = &$bin5->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));
  
-                                 $user_cur->comm[$user_cur->step % COMM_N] = $ret;
-                                 $user_cur->step_inc();
+                             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();
                          }
                      }
-                 }
-                 else {
-                     log_wr("NON CI SIAMO");
+                     $success = TRUE;
+                 } while(FALSE);
+                 if (!$success) {
+                     $ret = sprintf('gst.st = %d; asta_pnt_set(%d);', $user->step+1,
+                                    ($table->asta_pnt > 60 ? $table->asta_pnt + 1 : 61) );
+                     if ($ret_s != "") {
+                         $ret .= show_notify($ret_s, 0, $mlang_indwr['btn_close'][$G_lang], 400, 150);
+                     }
+                     $user->comm[$user->step % COMM_N] = $ret;
+                     $user->step_inc();
+                     log_wr("Ripetere.");
                  }
              }
              /*  asta::choose */
              else if ($argz[0] == 'choose') {
-                 if ($table->asta_win > -1 &&
-                     $user->table_pos == $table->asta_win) {
+                 $success = FALSE;
+                 do {
                      $a_brisco = $argz[1];
-                     if ($a_brisco >= 0 && $a_brisco < (BIN5_CARD_HAND * BIN5_PLAYERS_N)) {
-                         $table->briscola = $a_brisco;
-                         $table->friend   = $table->card[$a_brisco]->owner;
-                         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 = &$bin5->user[$table->player[$chooser]];
-                         for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-                             $user_cur = &$bin5->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);
+                     if (!$table->rules->engine(&$bin5, $curtime, BIN5_RULES_CHECKCHOOSE, $user, $ret_s, $a_brisco)) {
+                         break;
+                     }
  
-                             /* bg of caller cell */
-                             $ret .= briscola_show($bin5, $table, $user_cur);
+                     $table->briscola = $a_brisco;
  
-                             /* first gamer */
-                             if ($i == ($table->gstart % BIN5_PLAYERS_N))
-                                 $ret .= "is_my_time = true; remark_on();";
-                             else
-                                 $ret .= "is_my_time = false; remark_off();";
+                     if (BIN5_CARD_HAND == 8)
+                         $tourn_values = array(11, 10, 4,3,2, 1,1,1,1,1);
+                     else
+                         $tourn_values = array(33, 30, 12,9,6, 3,3,3,3,3);
  
-                             $user_cur->comm[$user_cur->step % COMM_N] = $ret;
-                             $user_cur->step_inc();
+                     $table->tourn_pts = 0;
+                     $seed = $a_brisco - ($a_brisco % 10);
+                     for ($i = $seed ; $i < ($seed + min(10, BIN5_CARD_HAND * BIN5_PLAYERS_N)) ; $i++) {
+                         if ($table->card[$i]->owner == $table->asta_win) {
+                             $table->tourn_pts += $tourn_values[$i - $seed];
                          }
-                         /*
-                           TUTTE LE VARIABILI DI STATO PER PASSARE A GIOCARE E LE
-                           VAR PER PASSARE ALLA FASE DI GIOCO
-                         */
+                     }
+                     $table->friend   = $table->card[$a_brisco]->owner;
+                     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 = &$bin5->user[$table->player[$chooser]];
+                     for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                         $user_cur = &$bin5->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($bin5, $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();
                      }
+                     /*
+                       TUTTE LE VARIABILI DI STATO PER PASSARE A GIOCARE E LE
+                       VAR PER PASSARE ALLA FASE DI GIOCO
+                     */
+                     $success = TRUE;
+                 } while (0);
+                 if (!$success) {
+                     $ret = "";
+                     if ($ret_s != "") {
+                         $ret = show_notify($ret_s, 0, $mlang_indwr['btn_close'][$G_lang], 400, 150);
+                     }
+                     $user->comm[$user->step % COMM_N] = $ret;
+                     $user->step_inc();
+                     log_wr("Ripetere.");
                  }
              }
          }
          else if ($user->subst == 'game') {
                      if ($table->turn == (BIN5_PLAYERS_N * BIN5_CARD_HAND)) { /* game finished */
                          log_wr(sprintf("GIOCO FINITO !!!"));
  
-                         if ($table->rules_engine($bin5, $curtime, BIN5_RULES_FINISH, $user)) {
 -                        if ($table->rules->engine(&$bin5, $curtime, BIN5_RULES_FINISH, $user)) {
++                        if ($table->rules->engine($bin5, $curtime, BIN5_RULES_FINISH, $user)) {
                              for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                                  $user_cur = &$bin5->user[$table->player[$i]];
 -                                $retar[$i] .= show_table(&$bin5,&$user_cur,$user_cur->step+1,TRUE, TRUE);
 +                                $retar[$i] .= show_table($bin5, $user_cur, $user_cur->step+1, TRUE, TRUE);
                              }
                          }
                      }
                          $user_cur->step_inc();
                      }
  
 -                    log_wr(sprintf("TURN: %d",$table->turn));
 +                    log_wr(sprintf("TURN: %d", $table->turn));
                      /* Have played all the players ? */
                      /* NO:  switch the focus and enable the next player to play. */
  
diff --combined web/index.php
@@@ -360,9 -360,6 +360,9 @@@ function index_main(&$brisk, $transp_ty
      GLOBAL $G_lang, $G_lng, $mlang_room;
      GLOBAL $BRISK_SHOWHTML, $BRISK_DEBUG, $_SERVER, $_COOKIE;
  
 +    $transp_port = ((array_key_exists("X-Forwarded-Proto", $header) &&
 +                     $header["X-Forwarded-Proto"] == "https") ? 443 : 80);
 +
      if (($sess = gpcs_var('sess', $get, $post, $cookie)) === FALSE)
          $sess = "";
      if (($name = gpcs_var('name', $get, $post, $cookie)) === FALSE)
              log_main("pre garbage_manager UNO");
              $brisk->garbage_manager(TRUE);
              log_main("post garbage_manager");
 -            if (($user = &$brisk->get_user($sess, &$idx)) != FALSE) {
 +            if (($user = $brisk->get_user($sess, $idx)) != FALSE) {
                  if ($user->the_end == FALSE) {
                      $brisk->sess_cur_set($user->sess);
                      log_main("user stat: ".$user->stat);
              /* try login */
  
              if ($banned == FALSE &&
 -                ($user = $brisk->add_user(&$sess, &$idx, $name, $pass_private,
 +                ($user = $brisk->add_user($sess, $idx, $name, $pass_private,
                                            $remote_addr, $header, $cookie)) != FALSE) {
                  $brisk->sess_cur_set($user->sess);
                  $ACTION = "room";
@@@ -652,7 -649,7 +652,7 @@@ google_color_text = "404040"
  google_color_url = "000000";
  //-->
  </script>
 -<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>';
 +<script type="text/javascript" src="https://pagead2.googlesyndication.com/pagead/show_ads.js"></script>';
              $banner_top_right = carousel_top();
          }
          else {
@@@ -671,7 -668,7 +671,7 @@@ google_color_text = "404040"
  google_color_url = "000000";
  //-->
  </script>
 -<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>';
 +<script type="text/javascript" src="https://pagead2.googlesyndication.com/pagead/show_ads.js"></script>';
          }
      }
      else { // !$G_is_local
  <table width="100%%" border="0" cols="3"><tr>
  <td align="left"><div style="padding-left: 8px;">'.$banner_top_left.'</div></td>
  <td align="center">'.(($G_with_topbanner || $G_with_donors) ? '<table><tr><td>' : '').'<div style="text-align: center;">
-     <!--<img class="nobo" src="img/brisk_logo64.png">--><img class="nobo" src="img/brisk_logo64_blackribbon.png" title="ciao grrr">
-     '.$mlang_room['headline'][$G_lang].'<br>
+  <img class="nobo" src="img/brisk_logo64.png">'
+ /*    <img class="nobo" src="img/brisk_logo64_blackribbon.png" title="ciao Prof" alt="ciao Prof">' */
+     .$mlang_room['headline'][$G_lang].'<br>
      </div>'.( ($G_with_topbanner || $G_with_donors) ? sprintf('</td><td>%s</td></tr></table>',
                                                                  ($G_with_topbanner ? $G_topbanner :
  "<div style='background-color: #ffd780; border: 1px solid black; text-align: center;'><img class='nobo' src=\"donometer.php?c=".$G_donors_cur."&a=".$G_donors_all."\"><div style='padding: 1px; background-color: white;'><b>donatori</b></div></div>") ) : '').'</td>
@@@ -995,7 -993,7 +996,7 @@@ supported by:<br
  <div style="position: absolute;">
  '.$altout_support_big.'
  </div>
- <a style="/* position: absolute; top: 40px; left: 6px; */" target="_blank" href="http://it-it.facebook.com/group.php?gid=59742820791"><img class="nobo" id="btn_facebook" src="img/facebook_btn.png" title="unisciti al gruppo \'quelli della brisk\'"></a>
+ <a style="/* position: absolute; top: 40px; left: 6px; */" target="_blank" href="https://www.facebook.com/groups/59742820791"><img class="nobo" id="btn_facebook" src="img/facebook_btn.png" title="unisciti al gruppo \'quelli della brisk\'"></a>
  ' . ( /* NOTE: here facebook or fake facebook */
  (!$G_is_local && $_cookie_law_3party == 'true') ?
  '<div class="fb-like" style="margin-top: 4px;" data-href="https://www.facebook.com/pages/Brisk-briscola-chiamata-in-salsa-ajax/716026558416911" data-share="false" data-send="true" data-width="70" data-show-faces="false" data-colorscheme="dark" layout="button_count"></div>
@@@ -1252,7 -1250,7 +1253,7 @@@ cookie_law(null)
          sidebanners_init($G_sidebanner_idx);
  ?>
       sess = "<?php echo "$sess"; ?>";
 -xstm = new xynt_streaming(window, "<?php echo "$transp_type"; ?>", 80, 2, null /* console */, gst, 'index_php', 'sess', sess, $('sandbox'), 'index_rd.php', function(com){eval(com);});
 +xstm = new xynt_streaming(window, <?php printf("\"%s\", %d", $transp_type, $transp_port); ?>, 2, null /* console */, gst, 'index_php', 'sess', sess, $('sandbox'), 'index_rd.php', function(com){eval(com);});
       xstm.hbit_set(heartbit);
       tra = new train($('room_tit'));
       window.onunload = onunload_cb;