first working version of rules change with custom bet
[brisk.git] / web / briskin5 / Obj / briskin5.phh
index 91fb9c7..d1bbbcc 100644 (file)
@@ -114,16 +114,6 @@ $mlang_bin5_bin5 = array(
 $table_wellarr = Array( 'it' => Array ( 'Benvenuto al tavolo. Se almeno tre giocatori non sbloccano l\'uscita cliccando il lucchetto, chi esce non può risedersi a un qualunque tavolo per '.floor(BAN_TIME/60).' minuti.'),
                         'en' => Array ( 'EN Benvenuto al tavolo. Se almeno tre giocatori non sbloccano l\'uscita cliccando il lucchetto, chi esce non può risedersi a un qualunque tavolo per '.floor(BAN_TIME/60).' minuti.') );
 
-function rules_id2name($id)
-{
-    if ($id == 1)
-        return 'Rules_old_rules';
-    else if ($id == 2)
-        return 'Rules_no_draw';
-
-    return 'Rules_unknown';
-}
-
 function multoval($mult)
 {
     GLOBAL $G_lang;
@@ -138,6 +128,10 @@ function multoval($mult)
         return (sprintf(($G_lang == 'en' ? "%d-ple" : "%d-plo"), $mult));
 }
 
+function dom_select_rules()
+{
+    printf("<select id='select_rules'><option value='1'>Vecchie regole: con pareggio</option><option value='2' selected>Nuove regole: senza pareggio</option><option value='4'>torneo \"insieme per gioco\"</option></select>");
+}
 
 class Card {
     var $value; /* 0 - 39 card value */
@@ -432,6 +426,7 @@ class Bin5_table extends Table {
             $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");
     }
@@ -503,6 +498,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 +511,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,18 +536,34 @@ 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 - */
 
-            // 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;
@@ -603,7 +614,6 @@ class Bin5_table extends Table {
             /* 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);
@@ -631,6 +641,110 @@ class Bin5_table extends Table {
         }
     }
 
+    function rules_change(&$bri, $user, $rules_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;
+            }
+
+            $rules_id = (int)$rules_id_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 ($user->rules_get() == $rules_id) {
+                $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())));
+                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)));
+                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);
+        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();
+        }
+    } // end function rules_change
 } // end class Bin5_table
 
 
@@ -638,7 +752,8 @@ class Bin5_table extends 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;   //
@@ -647,6 +762,9 @@ class Bin5_user extends User {
     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 = "../";
 
@@ -664,6 +782,7 @@ class Bin5_user extends User {
        $thiz->exitislock = TRUE;
        $thiz->privflags = 0;
        $thiz->continue = BIN5_USER_CONTINUE_INIT;
+       $thiz->rules = BIN5_USER_RULES_INIT;
 
        return ($thiz);
        }
@@ -684,6 +803,7 @@ class Bin5_user extends User {
         $this->exitislock = $from->exitislock;
         $this->privflags  = $from->privflags;
         $this->continue   = $from->continue;
+        $this->rules      = $from->rules;
     }
 
     /* CLONE NOT USED
@@ -719,6 +839,7 @@ class Bin5_user extends User {
         $thiz->handpt     = -1;
         $thiz->exitislock = TRUE;
         $thiz->continue   = BIN5_USER_CONTINUE_INIT;
+        $thiz->rules      = BIN5_USER_RULES_INIT;
 
         log_wr("Bin5 constructor");
 
@@ -965,6 +1086,15 @@ class Bin5_user extends User {
         return ($this->continue);
     }
 
+    function rules_set($rules_id)
+    {
+        $this->rules = $rules_id;
+    }
+
+    function rules_get() {
+        return ($this->rules);
+    }
+
 } // end class Bin5_user
 
 
@@ -1210,6 +1340,12 @@ class Bin5 {
             $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') {
@@ -1484,7 +1620,7 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
     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");
     }
 
@@ -1682,7 +1818,8 @@ function show_table_info(&$bri, &$table, $table_pos)
 
     // 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()))));
+    $noty .= sprintf('<table class=\"points\"><tr><th></th>');
 
     // Names.
     for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++)