refactored continue_match function
[brisk.git] / web / briskin5 / Obj / briskin5.phh
index 4e5b406..faf8c1b 100644 (file)
@@ -40,6 +40,21 @@ $mlang_bin5_bin5 = array(
                                                'en' => '%3$slast hand%4$s'),
                          'info_curr' => array( 'it' => '%3$smano corrente%4$s',
                                                'en' => '%3$scurrent hand%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 <b>your</b> turn.'),
+                         'info_turn' => array( 'it' => 'tocca a <b>%s</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_match'=> array( 'it' => 'Il codice della partita è <b>%d</b>.',
+                                               'en' => 'Match code is <b>%d</b>.'),
+
+
+
                          // br, hr, b, /b, win, fri
                          'info_part' => array( 'it' => 'Ha chiamato %3$s%5$s%4$s (punti torneo %7$d), il socio era %3$s%6$s%4$s,%1$s',
                                                'en' => 'The declarer was %3$s%5$s%4$s (tournment points %7$d), the partner was %3$s%6$s%4$s,%1$s'),
@@ -85,18 +100,6 @@ $mlang_bin5_bin5 = array(
                          '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_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 <b>your</b> turn.'),
-                         'info_turn' => array( 'it' => 'tocca a <b>%s</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',
@@ -500,6 +503,11 @@ class Bin5_table extends Table {
         $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;
@@ -508,11 +516,6 @@ class Bin5_table extends Table {
                 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;
@@ -538,20 +541,155 @@ class Bin5_table extends Table {
             /* - the user is in the list, add the match_id to his profile
                and check if he is the N'th to require continue - */
 
+            $continue_tot = 0;
+            for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                $user_cur = &$bri->user[$this->player[$i]];
+
+                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 ($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;
+            }
+
+            /* - all users decide to continue the same match, update all infos and rearrange users
+               to the right positions on the table - */
+
+            /*  reset users table order */
+            for ($i = 0 ; $i < BIN5_PLAYERS_N - 1 ; $i++) {
+                if ($bri->user[$this->player[$i]]->code == $ucodes[$i]) {
+                    continue;
+                }
+                for ($e = $i + 1 ; $e < BIN5_PLAYERS_N ; $e++) {
+                    if ($bri->user[$this->player[$e]]->code == $ucodes[$i]) {
+                        $swap = $this->player[$i];
+                        $this->player[$i] = $this->player[$e];
+                        $this->player[$e] = $swap;
+                        $bri->user[$this->player[$i]]->table_pos = $i;
+                        $bri->user[$this->player[$e]]->table_pos = $e;
+                    }
+                }
+            }
+            for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                fprintf(STDERR, "USERZ: [%s]\n", $bri->user[$this->player[$i]]->name);
+            }
+
+            // update database info to be aligned with current table (ttok and table_idx
+            if (($bdb = BriskDB::create()) != FALSE) {
+                if ($bdb->match_continue($match_id, $this, $user->table_orig) == FALSE) {
+                    unset($bdb);
+                    $msg = "aggiornamento dei dati della partita fallito";
+                    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);
+
+            /* reload of the page with the new layout */
             for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                 $user_cur = &$bri->user[$this->player[$i]];
-                if ($user_cur->continue_get() != $match_id) {
+                $user_cur->continue_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);
+        for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+            if ($ret == FALSE && $this->player[$i] != $user->idx)
+                continue;
+            $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();
+        }
+    }
+
+    function rules_change(&$bri, $user, $rules_code_s)
+    {
+        //
+        //  Rules: update version following loaded tcode
+        //
+        $ret = FALSE;
+        $curtime = time();
+
+        do {
+            /* - verify if match_id and user are both valid to accept
+               the match_continue request - */
+            $rules_id = (int)$match_code_s;
+            // FIXME: from dynamic rules list
+            if ($rules_id != 1 && $rules_id != 2 && $rules_id != 4) {
+                $msg = "queste regole non esistono o non sono attive";
+                break;
+            }
+
+            if ($this->match_id != -1) {
+                $msg = "Non si possono cambiare regole dopo che si è già ultimata una mano.";
+                break;
+            }
+
+            // set the match_id for the current user
+            $user->rules_set($rules_id);
+
+            // XXXXXXXXXXX
+            $tot_sel_rules = 0;
+            for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                if ($bri->user[$this->player[$i]]->rules_get() == BIN5_USER_RULES_INIT) {
+                    continue;
+                }
+
+                if ($bri->user[$this->player[$i]]->rules_get() != $rules_id) {
                     break;
                 }
+                $tot_sel_rules++;
             }
             $ret = TRUE;
             // not all players set the continue match than we exit
             if ($i < BIN5_PLAYERS_N) {
-                $msg = sprintf("<b>L'utente <i>%s</i> vorrebbe continuare la partita n° %d.</b>",
-                               xcape($user->name), $match_id);
+                $msg = sprintf("<b>L'utente <i>%s</i> vorrebbe utilizzare le %s.</b>",
+                               xcape($user->name), xcape(rules_id2descr($rules_id)));
                 break;
             }
 
@@ -635,7 +773,7 @@ class Bin5_table extends Table {
 
 define('BIN5_USER_FLAG_RING_ENDAUCT', 0x01);
 define('BIN5_USER_CONTINUE_INIT', -1);
-define('BIN5_USER_CONTINUE_ALREADY', -2);
+
 class Bin5_user extends User {
     var $asta_card;  //
     var $asta_pnt;   //