together17: add points constraint on the suit when auction is finished
authorMatteo Nastasi (mop) <nastasi@alternativeoutput.it>
Wed, 15 Mar 2017 07:17:42 +0000 (08:17 +0100)
committerMatteo Nastasi (mop) <nastasi@alternativeoutput.it>
Wed, 15 Mar 2017 07:17:42 +0000 (08:17 +0100)
TODO.txt
web/briskin5/Obj/briskin5.phh
web/briskin5/Obj/rules.phh
web/briskin5/Obj/rules_old_rules.phh
web/briskin5/Obj/rules_together17.phh
web/briskin5/index_wr.php

index c58de34..1fc2572 100644 (file)
--- a/TODO.txt
+++ b/TODO.txt
    * multiple rules
      DONE - show current rules
      DONE - select tournment dropdown menu (send a 'cont' like message for each change)
+     WIP - new rules for 'together for fun' turnment
+       DONE . strange 4 abandoned rule for auction
+       DONE . check of max points
+       DONE . check of suit at the end of bet
+
+     - select rules dropdown 'selected' to the current rule or the current
      - increase constraint for rules change
-     - strange 4 abandoned rule for auction
-     - check of max points
-     - check of suit at the end of bet
-     - new rules for 'together for fun' turnment
      - cache data structure for tournments
        . reload on SIGHUP
-     - select rules dropdown 'selected' to the current rule
 
    WIP * inherited info
    * Users Network construction
index 9523cd4..d3066be 100644 (file)
@@ -32,7 +32,9 @@ define('BIN5_PROXY_PATH', PROXY_PATH."/bin5");
 
 require_once('rules.phh');
 
-define('BIN5_TOURNAMENT_CURRENT', BIN5_TOURNAMENT_NO_DRAW);
+// FIXME: JUST FOR DEVELOP
+// define('BIN5_TOURNAMENT_CURRENT', BIN5_TOURNAMENT_NO_DRAW);
+define('BIN5_TOURNAMENT_CURRENT', BIN5_TOURNAMENT_TOGETHER17);
 
 $mlang_bin5_bin5 = array(
                          // br, hr, b, /b, win, fri
index f0d5ef7..9543975 100644 (file)
@@ -32,6 +32,7 @@ define('BIN5_RULES_ABANDON',    1);
 define('BIN5_RULES_ALLPASS',    2);
 define('BIN5_RULES_ASTA',       3);
 define('BIN5_RULES_NEXTAUCT',   4);
+define('BIN5_RULES_CHECKCHOOSE',5);
 
 require_once("rules_base.phh");
 require_once("rules_old_rules.phh");
index 957b8be..291f9d0 100644 (file)
@@ -125,6 +125,18 @@ class Rules_old_rules extends Rules {
         return FALSE;
     }
 
+    function rules_checkchoose(&$bri, $curtime, $action, $user, &$ret_s, $a_brisco)
+    {
+        if ( !($a_brisco >= 0 && $a_brisco < 40)) // (BIN5_CARD_HAND * BIN5_PLAYERS_N)) )
+            return FALSE;
+
+        if ( !($this->table->asta_win > -1 &&
+               $user->table_pos == $this->table->asta_win) )
+            return FALSE;
+
+        return TRUE;
+    }
+
     function rules_nextauct(&$bri, $curtime, $action, $user, $maxcard)
     {
         if (($this->table->asta_pla_n > ($maxcard > -1 ? 1 : 0)) &&
@@ -145,7 +157,7 @@ class Rules_old_rules extends Rules {
         $pnts_sav = array();
 
         if ($action == BIN5_RULES_ASTA) {
-            return ($this->rules_asta($bri, $curtime, $action, $user, &$opt1, $opt2, $opt3));
+            return ($this->rules_asta($bri, $curtime, $action, $user, $opt1, $opt2, $opt3));
         }
         else if ($action == BIN5_RULES_NEXTAUCT) {
             return ($this->rules_nextauct($bri, $curtime, $action, $user, $opt1));
@@ -182,6 +194,9 @@ class Rules_old_rules extends Rules {
             // $table->game_next(0);
             $table->game_init(&$bri->user);
         }
+        else if ($action == BIN5_RULES_CHECKCHOOSE) {
+            return ($this->rules_checkchoose($bri, $curtime, $action, $user, $opt1, $opt2));
+        }
         else if ($action == BIN5_RULES_FINISH) { // return TRUE if all correct
             $table->old_act = $action;
             do {
index c57c03e..8ab688d 100644 (file)
@@ -54,8 +54,6 @@ class Rules_together17 extends Rules_no_draw {
     {
         $mx = 0;
         for ($i = 0 ; $i < 4 ; $i++) {
-            error_log("tourn_pts_max ");
-            error_log(print_r($user->asta_tourn_pts, TRUE));
             if ($user->asta_tourn_pts[$i] > $mx) {
                 $mx = $user->asta_tourn_pts[$i];
             }
@@ -64,6 +62,35 @@ class Rules_together17 extends Rules_no_draw {
         return $mx;
     }
 
+    function min_tourn_points($a_pnt)
+    {
+        if ($a_pnt < 71)
+            $min_pts = 13;
+        else if ($a_pnt < 80)
+            $min_pts = 19;
+        else if ($a_pnt < 90)
+            $min_pts = 23;
+        else if ($a_pnt < 100)
+            $min_pts = 25;
+        else
+            $min_pts = 28;
+
+        return $min_pts;
+    }
+
+    function check_tourn_points($hand_pts, $a_pnt, $a_seed, &$ret_s) {
+        $min_pts = $this->min_tourn_points($a_pnt);
+
+        if ($hand_pts < $min_pts) {
+            // FIXME_LANG
+            $seeds = array('coppe', 'ori', 'spade', 'bastoni');
+            $ret_s = sprintf("Hai chiamato un due di %s a %d ma in mano per quel seme hai %d punti-torneo, non puoi.",
+                             $seeds[$a_seed], $a_pnt, $hand_pts);
+            return FALSE;
+        }
+        return TRUE;
+    }
+
     function rules_asta(&$bri, $curtime, $action, $user, &$ret_s, $a_card, $a_pnt) {
         /*
 Per le chiamate da 62 a 70 bisognerà avere 13 punti ( esempi.: asso e fante oppure tre
@@ -88,7 +115,6 @@ oppure asso, tre, cavallo, 7, 6, 5 e 4 ).
             $this->table->asta_pla_n--;
 
             if ($this->table->asta_card == -1 && $this->table->asta_pla_n == 1) {
-                error_log('table_asta_card: ' . $this->table->asta_card);
                 // all abandon auction except one => move next bid to two and 71 points
                 $this->table->asta_card = 9;
                 $this->table->asta_pnt = 70;
@@ -106,16 +132,7 @@ oppure asso, tre, cavallo, 7, 6, 5 e 4 ).
                 else if ($a_card == 9 &&
                          $a_pnt > ($this->table->asta_pnt >= 61 ? $this->table->asta_pnt : 60)
                          && $a_pnt <= 120) {
-                    if ($a_pnt < 71)
-                        $min_pts = 13;
-                    else if ($a_pnt < 80)
-                        $min_pts = 19;
-                    else if ($a_pnt < 90)
-                        $min_pts = 23;
-                    else if ($a_pnt < 100)
-                        $min_pts = 25;
-                    else
-                        $min_pts = 28;
+                    $min_pts = $this->min_tourn_points($a_pnt);
 
                     $max_hand_pts = $this->tourn_points_max($user);
                     if ($max_hand_pts < $min_pts) {
@@ -155,6 +172,20 @@ oppure asso, tre, cavallo, 7, 6, 5 e 4 ).
 
     }
 
+    function rules_checkchoose(&$bri, $curtime, $action, $user, &$ret_s, $a_brisco)
+    {
+        if (! parent::rules_checkchoose(&$bri, $curtime, $action, $user, &$ret_s, $a_brisco)) {
+            return FALSE;
+        }
+
+        if ($this->table->asta_card == 9) {
+            $bri_seed = (int)($a_brisco / 10);
+            return $this->check_tourn_points($user->asta_tourn_pts[$bri_seed],
+                                             $this->table->asta_pnt, $bri_seed, $ret_s);
+        }
+
+        return TRUE;
+    }
 } // class Rules_no_draw
 
 ?>
\ No newline at end of file
index 9c57361..a80a554 100644 (file)
@@ -325,62 +325,77 @@ function bin5_index_wr_main(&$bin5, $remote_addr_full, $get, $post, $cookie)
             }
             /*  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;
 
-                        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);
+                    if (!$table->rules->engine(&$bin5, $curtime, BIN5_RULES_CHECKCHOOSE, $user, $ret_s, $a_brisco)) {
+                        break;
+                    }
 
-                        $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];
-                            }
+                    $table->briscola = $a_brisco;
+
+                    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);
+
+                    $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];
                         }
+                    }
 
-                        $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);
+                    $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);
+                    $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 ($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);
+                        /* 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();";
+                        /* 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
-                        */
+                        $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') {