refactored continue_match function
authorMatteo Nastasi (mop) <nastasi@alternativeoutput.it>
Wed, 1 Mar 2017 17:41:26 +0000 (18:41 +0100)
committerMatteo Nastasi (mop) <nastasi@alternativeoutput.it>
Wed, 1 Mar 2017 17:41:26 +0000 (18:41 +0100)
web/briskin5/Obj/briskin5.phh

index 91fb9c7..faf8c1b 100644 (file)
@@ -503,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;
@@ -511,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;
@@ -541,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;
             }
 
@@ -638,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;   //