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

27 files changed:
INSTALL.sh
TODO.txt
bin/5fire.sh [new file with mode: 0755]
bin/brisk_explain_update.sh [new file with mode: 0755]
bin/brisk_pts_update.sh [new file with mode: 0755]
sql/sql.d/080-games-tourn-pts.sql [new file with mode: 0644]
sql/sql.d/085-tourn-update.sql [new file with mode: 0644]
sql/sql.d/090-together-add.sql [new file with mode: 0644]
web/Obj/brisk.phh
web/Obj/dbase_pgsql.phh
web/Obj/user.phh
web/brisk.css
web/briskin5/Obj/briskin5.phh
web/briskin5/Obj/rules.phh [new file with mode: 0644]
web/briskin5/Obj/rules_base.phh [new file with mode: 0644]
web/briskin5/Obj/rules_no_draw.phh [new file with mode: 0644]
web/briskin5/Obj/rules_old_rules.phh [new file with mode: 0644]
web/briskin5/Obj/rules_together17.phh [new file with mode: 0644]
web/briskin5/briskin5.js
web/briskin5/index.php
web/briskin5/index_wr.php
web/briskin5/stat-day.php
web/briskin5/statadm.php
web/index.php
web/room.css
web/room.js
web/usermgmt.php

index 219c73e..1966c41 100755 (executable)
@@ -85,7 +85,7 @@ function searchetc() {
         fi
         pp="$(dirname "$pp")"
     done
-    
+
     return 1
 }
 
@@ -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 @@ if [ "$web_only" = "FALSE" ]; then
        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
@@ -369,7 +369,7 @@ if [ "$web_only" = "FALSE" ]; then
 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
index ce58d46..266c4ff 100644 (file)
--- a/TODO.txt
+++ b/TODO.txt
@@ -3,6 +3,7 @@
 
   BUGS |
  ------+
+   - /cont and /rules just during 'bidding' phase
    DONE - Not sequence of 3 same chars
    DONE   . check server side with test
    DONE - Global vars checker
 
   FEATURES |
  ----------+
+   * 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
+
+     DONE - increase constraint for rules change
+     DONE - select rules dropdown 'selected' to the current rule or the current
+
+     POSTPONED - no points multiplication for abandon
+     POSTPONED - cache data structure for tournments
+     POSTPONED   . reload on SIGHUP
+
+
    WIP * inherited info
    * Users Network construction
      DONE - sql
diff --git a/bin/5fire.sh b/bin/5fire.sh
new file mode 100755 (executable)
index 0000000..472073d
--- /dev/null
@@ -0,0 +1,85 @@
+#!/bin/bash
+# set -x
+declare -a coor pids
+#coor[0]="0,0,0,560,650"
+#coor[1]="0,443,108,560,650"
+#coor[2]="0,878,197,560,650"
+coor[0]="0,0,0,840,975"
+coor[1]="0,863,0,840,975"
+coor[2]="0,1712,0,840,975"
+coor[3]="0,863,300,840,975"
+coor[4]="0,1712,300,840,975"
+
+
+# TODO: pids2wids function IN: pids OUT: associated windows ids
+
+ffox () {
+    if [ "$1" = "-v" ]; then
+        ps ax | egrep '[0-9] /usr/lib/firefox/firefox -no-remote -P (one|two|three|four|five) ' | grep -v grep | sed 's/^ *//g;s/ .*-P//g;s/ http.*//g'
+    else
+        ps ax | egrep '[0-9] /usr/lib/firefox/firefox -no-remote -P (one|two|three|four|five) ' | grep -v grep | sed 's/^ *//g;s/ .*//g'
+    fi
+}
+
+rearrange_windows () {
+    ct=0
+    while true; do
+        sleep 1
+        wids="$(wmctrl -l -p | sed 's/ \+/|/g' | cut -d '|' -f 1,3 | egrep "\|(${pids[0]}|${pids[1]}|${pids[2]}|${pids[3]}|${pids[4]})$")"
+        l="$(echo "$wids" | wc -l)"
+        if [ $l -eq 5 ]; then
+            for i in $(seq 0 4); do
+                wid="$(echo "$wids" | grep "|${pids[$i]}\$" | cut -d '|' -f 1)"
+                wmctrl -i -r $wid -e ${coor[$i]}
+                echo wmctrl out: $?
+            done
+            break
+        fi
+        ct=$((ct + 1))
+        if [ $ct -gt 10 ]; then
+            break
+        fi
+    done
+}
+
+#
+#  MAIN
+#
+HOMEPAGE="http://dodo.birds.van/brisk/index.php"
+if [ "$1" = "help" -o "$1" = "-h" -o "$1" = "--help" ]; then
+    echo "$0       - run firefoxes"
+    echo "$0 list [-v] - list firefoxes"
+    echo "$0 <stop|cont|term|kill> - send signal to firefoxes"
+    echo "$0 help  - this help"
+elif [ "$1" = "list" ]; then
+    ffox $2
+elif [ "$1" = "stop" -o "$1" = "cont" -o "$1" = "term" -o "$1" = "kill" ]; then
+    case "$1" in
+       stop) sig=-STOP ;;
+       cont) sig=-CONT ;;
+       term) sig=-TERM ;;
+       kill) sig=-KILL ;;
+    esac
+    
+    kill $sig $(ffox)
+elif [ "$1" = "rearrange" ]; then
+    list="$($0 list -v)"
+    declare -a pids
+    ct=0
+    for i in one two three four five; do
+        pids[$ct]="$(echo "$list" | grep -- " $i$" | sed 's/ .*//g')"
+        ct=$((ct + 1))
+    done
+    rearrange_windows
+elif [ $# -eq 0 ]; then
+    ct=0
+    for i in one two three four five; do
+        firefox -no-remote -P $i "$HOMEPAGE?whoami=$i" &
+        pd="$!"
+        echo "$i: $pd"
+        pids[$ct]="$pd"
+        ct=$((ct + 1))
+    done
+
+    rearrange_windows
+fi
diff --git a/bin/brisk_explain_update.sh b/bin/brisk_explain_update.sh
new file mode 100755 (executable)
index 0000000..51faf5b
--- /dev/null
@@ -0,0 +1,35 @@
+#!/bin/bash
+# set -x
+export PATH=/home/nastasi/bin:/usr/local/bin:/usr/bin:/bin:/usr/games
+
+CONFIG_FILE="$HOME/.brisk_install"
+
+# default values
+web_url="http://localhost/brisk"
+admin_password=""
+if [ -f "$CONFIG_FILE" ]; then
+   source "$CONFIG_FILE"
+   conffile_in="$CONFIG_FILE"
+fi
+
+tty -s
+is_a_tty=$?
+if [ -z "$admin_password" ]; then
+    if [ "$is_a_tty" -eq 0 ]; then
+        read -s -p "Please insert admin password (no echo): " admin_password
+    else
+        echo "Incomplete configuration"
+        exit 1
+    fi
+fi
+
+# now="$(date -d '2014-01-21 23:56:00' +%s)"
+now="$(date +%s)"
+delta="86400"
+
+to="$(date +"%Y-%m-%d+%H:%M:%S" -d @$(echo "($now / 86400) * 86400 + 7200 + $delta" | bc))"
+from="$(date +"%Y-%m-%d+%H:%M:%S" -d @$(echo "($now / 86400) * 86400 + 7200 - (86400) + $delta" | bc))"
+# to="$(date +"%Y-%m-%d+%H:%M:%S" -d @$(echo "$now + 7200 + $delta" | bc))"
+# from="$(date +"%Y-%m-%d+%H:%M:%S" -d @$(echo "$now - 9200 + $delta" | bc))"
+
+curl -d "pazz=$admin_password" "$web_url/briskin5/stat-day.php?from=$from&to=$to"
diff --git a/bin/brisk_pts_update.sh b/bin/brisk_pts_update.sh
new file mode 100755 (executable)
index 0000000..791521e
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/bash
+set -x
+B_HOSTNAME="http://localhost/brisk"
+export PATH=/home/nastasi/bin:/usr/local/bin:/usr/bin:/bin:/usr/games
+curl -d 'pazz=yourpasswd' "$B_HOSTNAME/briskin5/statadm.php"
diff --git a/sql/sql.d/080-games-tourn-pts.sql b/sql/sql.d/080-games-tourn-pts.sql
new file mode 100644 (file)
index 0000000..0efa468
--- /dev/null
@@ -0,0 +1,4 @@
+-- add tourn_pts to bin5_games table
+ALTER TABLE #PFX#bin5_games DROP COLUMN tourn_pts;
+ALTER TABLE #PFX#bin5_games ADD COLUMN tourn_pts integer DEFAULT -1;  -- points at the beginning of the hand
+
diff --git a/sql/sql.d/085-tourn-update.sql b/sql/sql.d/085-tourn-update.sql
new file mode 100644 (file)
index 0000000..56dd0c4
--- /dev/null
@@ -0,0 +1,7 @@
+--  from:
+--    INSERT INTO #PFX#bin5_tournaments (code, active, name) VALUES (1, 1, 'normal match');
+--    INSERT INTO #PFX#bin5_tournaments (code, active, name) VALUES (2, 1, 'special match');
+
+UPDATE #PFX#bin5_tournaments SET (name) = ('old rules: with draw') WHERE code = 1;
+UPDATE #PFX#bin5_tournaments SET (name) = ('new rules: without draw') WHERE code = 2;
+INSERT INTO #PFX#bin5_tournaments (code, active, name) VALUES (3, 1, 'special match');
diff --git a/sql/sql.d/090-together-add.sql b/sql/sql.d/090-together-add.sql
new file mode 100644 (file)
index 0000000..364c911
--- /dev/null
@@ -0,0 +1,2 @@
+-- new tournment id of 'insieme per gioco' tournment
+INSERT INTO #PFX#bin5_tournaments (code, active, name) VALUES (4, 1, 'together for fun');
index 0c33591..c89d6ac 100644 (file)
@@ -153,10 +153,10 @@ $mlang_brisk = array( 'btn_backstand'=> array( 'it' => 'torna in piedi',
 $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.',
index cdcec51..74a5dbd 100644 (file)
@@ -628,13 +628,6 @@ class BriskDB
         }
         $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);
@@ -642,6 +635,20 @@ class BriskDB
             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);
     }
@@ -712,8 +719,9 @@ class BriskDB
             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;
@@ -760,13 +768,14 @@ class BriskDB
             /*
              * 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;
index c972404..305dd34 100644 (file)
@@ -707,7 +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;
index 75b4975..c0a99b0 100644 (file)
@@ -28,7 +28,7 @@
 }
 
 body {
-    background-image: url('img/najole_wh.png');
+    background-image: url('img/lines.png');
     background-color: #fafafa;
     background-attachment: fixed;
     margin: 0px;
@@ -110,7 +110,7 @@ img.ib_nobo {
     -moz-border-radius: 8px;
     border-radius: 8px;
 
-    background-image: url('img/najole_wh_light.png');
+    background-image: url('img/lines_light.png');
     background-attachment: fixed;
 
     top: 0;
index 67b584c..c9002b9 100644 (file)
@@ -30,10 +30,9 @@ define('BIN5_SHM_MAX', (BIN5_SHM_MIN + 1048576));
 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
@@ -41,51 +40,8 @@ $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'),
-                         // 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.',
@@ -94,10 +50,9 @@ $mlang_bin5_bin5 = array(
                                                '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 @@ 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 */
@@ -168,23 +136,24 @@ class Card {
 } // 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)
@@ -198,6 +167,9 @@ class Bin5_table extends Table {
     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()
     {
     }
@@ -223,6 +195,7 @@ class Bin5_table extends 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;
 
@@ -266,6 +239,7 @@ class Bin5_table extends Table {
 
        $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;
@@ -290,6 +264,7 @@ class Bin5_table extends Table {
 
     function spawn(&$from)
     {
+        GLOBAL $G_lang;
         if (($thiz =& new Bin5_table()) == FALSE)
             return (FALSE);
 
@@ -299,7 +274,7 @@ class Bin5_table extends Table {
 
         $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;
@@ -310,6 +285,8 @@ class Bin5_table extends Table {
         $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++)
@@ -320,41 +297,6 @@ class Bin5_table extends Table {
         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
     //   {
@@ -436,6 +378,7 @@ class Bin5_table extends Table {
         $this->asta_pnt  = 60;
         $this->asta_win  = -1;
         $this->briscola  = -1;
+        $this->tourn_pts = -1;
         $this->friend    = -1;
         $this->turn      =  0;
 
@@ -446,6 +389,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");
     }
@@ -508,170 +452,20 @@ class Bin5_table extends Table {
         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;
@@ -680,11 +474,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;
@@ -710,18 +499,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;
@@ -759,6 +564,10 @@ class Bin5_table extends Table {
                 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'];
@@ -768,7 +577,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);
@@ -796,6 +604,127 @@ class Bin5_table extends Table {
         }
     }
 
+    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
 
 
@@ -803,7 +732,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;   //
@@ -812,6 +742,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 = "../";
 
@@ -829,6 +762,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);
        }
@@ -849,6 +783,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
@@ -884,6 +819,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");
 
@@ -1130,6 +1066,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
 
 
@@ -1375,6 +1320,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') {
@@ -1613,8 +1564,10 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
     $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));
 
@@ -1650,7 +1603,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");
     }
 
@@ -1750,6 +1703,7 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
                             $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 +1802,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(), $G_lang))));
+    $noty .= sprintf('<table class=\"points\"><tr><th></th>');
 
     // Names.
     for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++)
@@ -1908,7 +1863,7 @@ function show_table_info(&$bri, &$table, $table_pos)
         $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 +1928,6 @@ function briscola_show($bri, $table, $user)
     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) {
@@ -2004,111 +1939,5 @@ function log_points($remote_addr, $curtime, $user, $where, $mesg)
     }
 }
 
-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 --git a/web/briskin5/Obj/rules.phh b/web/briskin5/Obj/rules.phh
new file mode 100644 (file)
index 0000000..48e540b
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+/*
+ *  brisk - rules.phh
+ *
+ *  Copyright (C) 2017 Matteo Nastasi
+ *                          mailto: nastasi@alternativeoutput.it
+ *                                  matteo.nastasi@milug.org
+ *                          web: http://www.alternativeoutput.it
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details. You should have received a
+ * copy of the GNU General Public License along with this program; if
+ * not, write to the Free Software Foundation, Inc, 59 Temple Place -
+ * Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+define('BIN5_TOURNAMENT_OLDRULES', 1);
+define('BIN5_TOURNAMENT_NO_DRAW',  2);
+define('BIN5_TOURNAMENT_TOGETHER17',  4);
+
+define('BIN5_RULES_OLDSCHEMA', -1);
+define('BIN5_RULES_FINISH',     0);
+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");
+require_once("rules_no_draw.phh");
+require_once("rules_together17.phh");
+
+// FIXME - DYNAMIC WITH CACHE AND RELOAD FROM DB
+function rules_keys()
+{
+    return array(1,2,4);
+}
+
+function rules_id2name($id)
+{
+    if ($id == 1)
+        return 'Rules_old_rules';
+    else if ($id == 2)
+        return 'Rules_no_draw';
+    else if ($id == 4)
+        return 'Rules_together17';
+
+    return 'Rules_unknown';
+}
+
+function rules_id2descr($id, $lang)
+{
+    if ($id == 1)
+        return 'regole vecchie (con pareggio)';
+    else if ($id == 2)
+        return 'regole nuove (senza pareggio)';
+    else if ($id == 4)
+        return 'regole del torneo "insieme per gioco"';
+
+    return 'Regole sconosciute';
+}
+
+?>
\ No newline at end of file
diff --git a/web/briskin5/Obj/rules_base.phh b/web/briskin5/Obj/rules_base.phh
new file mode 100644 (file)
index 0000000..6f93892
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+/*
+ *  brisk - rules.phh
+ *
+ *  Copyright (C) 2017 Matteo Nastasi
+ *                          mailto: nastasi@alternativeoutput.it
+ *                                  matteo.nastasi@milug.org
+ *                          web: http://www.alternativeoutput.it
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details. You should have received a
+ * copy of the GNU General Public License along with this program; if
+ * not, write to the Free Software Foundation, Inc, 59 Temple Place -
+ * Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+require_once("briskin5.phh");
+
+$mlang_bin5_rules = array(
+                         // 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.')
+                          );
+
+abstract class Rules {
+    var $table;
+    var $id;
+
+    abstract function engine(&$bri, $curtime, $action, $user);
+
+    function __construct($table)
+    {
+        $this->table = $table;
+    }
+
+    function id_get()
+    {
+        return ($this->id);
+    }
+
+    function tourn_points(&$user, $i)
+    {
+        return;
+    }
+
+    function tourn_points_max($user)
+    {
+        return 0;
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/web/briskin5/Obj/rules_no_draw.phh b/web/briskin5/Obj/rules_no_draw.phh
new file mode 100644 (file)
index 0000000..c5ca0cf
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/*
+ *  brisk - rules_no_draw.phh
+ *
+ *  Copyright (C) 2017 Matteo Nastasi
+ *                          mailto: nastasi@alternativeoutput.it
+ *                                  matteo.nastasi@milug.org
+ *                          web: http://www.alternativeoutput.it
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details. You should have received a
+ * copy of the GNU General Public License along with this program; if
+ * not, write to the Free Software Foundation, Inc, 59 Temple Place -
+ * Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+require_once("briskin5.phh");
+require_once("rules_base.phh");
+
+class Rules_no_draw extends Rules_old_rules {
+    function __construct($table)
+    {
+        parent::__construct($table);
+        $this->id = 2;
+    }
+
+    static function game_result($asta_pnt, $pnt)
+    {
+        if ($pnt >= $asta_pnt)
+            return (1);
+        else
+            return (-1);
+    }
+
+} // class Rules_no_draw
+
+?>
\ No newline at end of file
diff --git a/web/briskin5/Obj/rules_old_rules.phh b/web/briskin5/Obj/rules_old_rules.phh
new file mode 100644 (file)
index 0000000..ffa1a1b
--- /dev/null
@@ -0,0 +1,430 @@
+<?php
+/*
+ *  brisk - rules_old_rules.phh
+ *
+ *  Copyright (C) 2017 Matteo Nastasi
+ *                          mailto: nastasi@alternativeoutput.it
+ *                                  matteo.nastasi@milug.org
+ *                          web: http://www.alternativeoutput.it
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details. You should have received a
+ * copy of the GNU General Public License along with this program; if
+ * not, write to the Free Software Foundation, Inc, 59 Temple Place -
+ * Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+require_once("briskin5.phh");
+require_once("rules_base.phh");
+
+class Rules_old_rules extends Rules {
+    function __construct($table)
+    {
+        parent::__construct($table);
+        $this->id = 1;
+    }
+
+    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);
+    }
+    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 multer($is_new)
+    {
+        if ($is_new) {
+            return (static::s_multer($this->table->mult, $this->table->asta_pnt));
+        }
+        else {
+            return (static::s_multer($this->table->old_mult, $this->table->old_asta_pnt));
+        }
+    }
+
+    static function game_result($asta_pnt, $pnt)
+    {
+        $sixty = (BIN5_PLAYERS_N == 3 ? 30 : 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 rules_asta(&$bri, $curtime, $action, $user, &$ret_s, $a_card, $a_pnt)
+    {
+        $index_cur = $this->table->gstart % BIN5_PLAYERS_N;
+
+        // Abbandono dell'asta
+        if ($a_card <= -1) {
+            log_wr("Abbandona l'asta.");
+            $this->table->asta_pla[$index_cur] = FALSE;
+            $user->asta_card  = -1;
+            $this->table->asta_pla_n--;
+
+            return TRUE;
+        }
+        else if ($a_card <= 9) {
+            $ret_s = "";
+
+            do {
+                if ($a_card >= 0 && $a_card < 9 && $a_card > $this->table->asta_card)
+                    ;
+                else if ($a_card == 9 && $a_pnt > ($this->table->asta_pnt >= 61 ? $this->table->asta_pnt : 60)
+                         && $a_pnt <= 120)
+                    ;
+                else
+                    break;
+
+                $user->asta_card  = $a_card;
+                $this->table->asta_card = $a_card;
+                if ($a_card == 9) {
+                    $user->asta_pnt   = $a_pnt;
+                    $this->table->asta_pnt  = $a_pnt;
+                }
+
+                return TRUE;
+            } while (0);
+        }
+
+        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)) &&
+            !($this->table->asta_card == 9 && $this->table->asta_pnt == 120)) {
+            return TRUE;
+        }
+        else {
+            return FALSE;
+        }
+
+    }
+
+    function engine(&$bri, $curtime, $action, $user, &$opt1 = NULL, &$opt2 = NULL, &$opt3 = NULL)
+    {
+        GLOBAL $G_all_points, $G_dbasetype;
+
+        $table = $this->table;
+        $pnts_sav = array();
+
+        if ($action == BIN5_RULES_ASTA) {
+            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));
+        }
+        else if ($action == BIN5_RULES_ALLPASS) { // return TRUE if all correct
+            $table->old_act = $action;
+            $table->old_asta_win = -1;
+            $table->old_pnt = 0;
+            $table->mult_inc(1);
+            for ($i = 0 ; $i < PLAYERS_N ; $i++) {
+                $pnts_sav[$i] = 0;
+            }
+
+            $game_delta = 1;
+            // $table->game_next(1);
+            $table->game_init(&$bri->user);
+        }
+        else if ($action == BIN5_RULES_ABANDON) { // return TRUE if all correct
+            if (!($user->handpt <= 2)) {
+                return (FALSE);
+            }
+            $table->old_act = $action;
+            log_wr(sprintf("GIOCO FINITO !!!"));
+            $table->old_asta_win = $user->table_pos;
+            $table->old_pnt = 0;
+            $table->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;
+            // $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 {
+                $pro = 0;
+
+                if ($table->asta_pnt == 60)
+                    $table->asta_pnt = 61;
+
+                $table->old_reason = "";
+
+                // count points for the temporary 2 teams
+                for ($i = 0 ; $i < (BIN5_CARD_HAND * BIN5_PLAYERS_N) ; $i++) {
+                    $ctt = $table->card[$i]->value % 10;
+                    $own = $table->card[$i]->owner;
+                    if ($own == $table->asta_win || $own == $table->friend)
+                        $pro += $G_all_points[$ctt];
+                }
+
+                log_wr(sprintf("PRO: [%d]", $pro));
+
+                // PATTA case !
+                if (static::game_result($table->asta_pnt, $pro) == 0) {
+                    $table->points[$table->points_n % MAX_POINTS] = array();
+                    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                        $table->points[$table->points_n % MAX_POINTS][$i] = 0;
+                        $pnts_sav[$i] = 0;
+                    }
+                    $table->points_n++;
+                    $table->old_pnt = $pro;
+                    $table->old_asta_win = $table->asta_win;
+                    $table->mult_inc(1);
+
+                    break;
+                    }
+
+                if (static::game_result($table->asta_pnt, $pro) == 1)
+                    $sig = 1;
+                else
+                    $sig = -1;
+
+                // TAG: POINTS_MANAGEMENT
+                $table->points[$table->points_n % MAX_POINTS] = array();
+                for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                    if ($i == $table->asta_win)
+                        $pnt = ($i == $table->friend ? 4 : 2);
+                    else if ($i == $table->friend)
+                        $pnt = 1;
+                    else
+                        $pnt = -1;
+
+                    log_wr(sprintf("PRO: pt[%d][%d] = %d", $table->points_n % MAX_POINTS, $i, $pnt));
+
+                    $pnt_sav = static::s_point_calc($pnt * $sig,           0, $table->asta_pnt, ($pro == 120));
+                    $pnt_tab = static::s_point_calc($pnt * $sig, $table->mult, $table->asta_pnt, ($pro == 120));
+
+                    $table->points[$table->points_n % MAX_POINTS][$i] = $pnt_tab;
+                    $table->total[$i] += $pnt_tab;
+                    $pnts_sav[$i] = $pnt_sav;
+                }
+                $table->points_n++;
+                $table->old_pnt = $pro;
+                $table->old_asta_win = $table->asta_win;
+                $table->mult_set(0);
+            } while (0);
+            $game_delta = 1;
+        }
+        else {
+            return (FALSE);
+        }
+        $table->game_next($game_delta);
+
+        $plist = "$table->table_token|$user->table_orig|$table->player_n";
+        $ucodes = array();
+        $codes = "";
+        for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+            $user_cur = &$bri->user[$table->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);
+
+        $table->old_asta_pnt = $table->asta_pnt;
+        // $table->old_mazzo is managed by ->game_next();
+        // $table->old_mult, $table->old_pnt, $table->old_reason and $table->old_asta_win are specific
+
+        $table->old_friend = $table->friend;
+        $table->old_tourn_pts = $table->tourn_pts;
+
+        $table->old_reason = static::game_description($action, 'html', $table->old_mult,
+                                             $table->old_asta_win,
+                                             ($table->old_asta_win != -1 ?
+                                              $bri->user[$table->player[$table->old_asta_win]]->name : ""),
+                                             $table->old_friend,
+                                             ($table->old_friend != -1 ?
+                                              $bri->user[$table->player[$table->old_friend]]->name : ""),
+                                             $table->old_pnt, $table->old_asta_pnt, $table->old_tourn_pts);
+
+
+        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, $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);
+        }
+
+        $table->game_init(&$bri->user);
+
+        return (TRUE);
+    }
+
+    static function game_description($act, $form, $old_mult, $win = -1, $win_name = "?1?", $fri = -1, $fri_name = "?2?",
+                              $old_pnt = -1, $old_asta_pnt = -1, $old_tourn_pts = -1)
+    {
+        GLOBAL $G_lang, $mlang_bin5_rules;
+
+        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_rules['info_alpa'][$G_lang],
+                            $tg_br, $tg_hr, $tg_bo, $tg_bc));
+        }
+        else if ($act == BIN5_RULES_ABANDON) {
+            return (sprintf($mlang_bin5_rules['info_aban'][$G_lang],
+                            $tg_br, $tg_hr, $tg_bo, $tg_bc,
+                            $win_name));
+        }
+        else {
+            $wol = static::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_rules['info_part'][$G_lang],
+                                 $tg_br, $tg_hr, $tg_bo, $tg_bc,
+                                 $win_name,
+                                 $fri_name);
+                if ($old_pnt == 120) {
+                    $noty .= sprintf($mlang_bin5_rules['info_capp'][$G_lang],
+                                     $tg_br, $tg_hr, $tg_bo, $tg_bc );
+                }
+                else {
+                    if ($old_asta_pnt > 61) {
+                        $noty .= sprintf($mlang_bin5_rules['info_alea'][$G_lang],
+                                         $tg_br, $tg_hr, $tg_bo, $tg_bc,
+                                         $old_asta_pnt, $old_pnt,
+                                         ($wol == 1 ? $mlang_bin5_rules['info_win'][$G_lang] :
+                                          ($wol == 0 ? $mlang_bin5_rules['info_peer'][$G_lang] :
+                                           $mlang_bin5_rules['info_lost'][$G_lang])));
+                    }
+                    else {
+                        $noty .= sprintf($mlang_bin5_rules['info_more'][$G_lang],
+                                         $tg_br, $tg_hr, $tg_bo, $tg_bc,
+                                         $old_pnt,
+                                         ($wol == 1 ? $mlang_bin5_rules['info_win'][$G_lang] :
+                                          ($wol == 0 ? $mlang_bin5_rules['info_peer'][$G_lang] :
+                                           $mlang_bin5_rules['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_rules['info_alon'][$G_lang],
+                                 $tg_br, $tg_hr, $tg_bo, $tg_bc,
+                                 $win_name);
+                if ($old_pnt == 120) {
+                    $noty .= sprintf($mlang_bin5_rules['info_acap'][$G_lang],
+                                     $tg_br, $tg_hr, $tg_bo, $tg_bc);
+                }
+                else {
+                    if ($old_asta_pnt > 61) {
+                        $noty .= sprintf($mlang_bin5_rules['info_aleaa'][$G_lang],
+                                         $tg_br, $tg_hr, $tg_bo, $tg_bc,
+                                         $old_asta_pnt, $old_pnt,
+                                         ($wol == 1 ? $mlang_bin5_rules['info_win'][$G_lang] :
+                                          ($wol == 0 ? $mlang_bin5_rules['info_peer'][$G_lang] :
+                                           $mlang_bin5_rules['info_lost'][$G_lang])));
+                    }
+                    else {
+                        $noty .= sprintf($mlang_bin5_rules['info_morea'][$G_lang],
+                                         $tg_br, $tg_hr, $tg_bo, $tg_bc,
+                                         $old_pnt,
+                                         ($wol == 1 ? $mlang_bin5_rules['info_win'][$G_lang] :
+                                          ($wol == 0 ? $mlang_bin5_rules['info_peer'][$G_lang] :
+                                           $mlang_bin5_rules['info_lost'][$G_lang])));
+                    }
+                }
+            }
+        }
+
+        $old_multer = static::s_multer($old_mult, $old_asta_pnt);
+        if ($old_multer > 1) {
+            $noty .= sprintf($mlang_bin5_rules['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);
+    }
+} // class Rules_old_rules
+
+?>
\ No newline at end of file
diff --git a/web/briskin5/Obj/rules_together17.phh b/web/briskin5/Obj/rules_together17.phh
new file mode 100644 (file)
index 0000000..86b0d22
--- /dev/null
@@ -0,0 +1,314 @@
+<?php
+/*
+ *  brisk - rules_together17.phh
+ *
+ *  Copyright (C) 2017 Matteo Nastasi
+ *                          mailto: nastasi@alternativeoutput.it
+ *                                  matteo.nastasi@milug.org
+ *                          web: http://www.alternativeoutput.it
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details. You should have received a
+ * copy of the GNU General Public License along with this program; if
+ * not, write to the Free Software Foundation, Inc, 59 Temple Place -
+ * Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+require_once("briskin5.phh");
+require_once("rules_base.phh");
+
+
+$mlang_bin5_toge17_rules =
+    array(
+          // 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'),
+          // br, hr, b, /b, win_name
+          'info_alon' => array( 'it' => '%3$s%5$s%4$s si è chiamato in mano (punti torneo %6$d),%1$s',
+                                'en' => '%3$s%5$s%4$s play alone against each other (tournment points %6$d),%1$s')
+          );
+
+class Rules_together17 extends Rules_no_draw {
+    function __construct($table)
+    {
+        parent::__construct($table);
+        $this->id = 4;
+    }
+
+    function tourn_points(&$user, $user_pos)
+    {
+        $card = $this->table->card;
+        unset($user->asta_tourn_pts);
+        $user->asta_tourn_pts = array(0, 0, 0, 0);
+        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);
+
+        for ($i = 0 ; $i < BIN5_PLAYERS_N * BIN5_CARD_HAND ; $i++) {
+
+            if ($card[$i]->owner == $user_pos) {
+                $user->asta_tourn_pts[(int)($i / 10)] += $tourn_values[$i % 10];
+            }
+        }
+    }
+
+    function tourn_points_max($user)
+    {
+        $mx = 0;
+        for ($i = 0 ; $i < 4 ; $i++) {
+            if ($user->asta_tourn_pts[$i] > $mx) {
+                $mx = $user->asta_tourn_pts[$i];
+            }
+        }
+
+        return $mx;
+    }
+
+    function min_tourn_points($a_pnt)
+    {
+        if ($a_pnt < 62)
+            $min_pts = 0;
+        else 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
+e cavallo oppure re, cavallo, fante, sette, sei, cinque, quattro) ;
+Per chiamate da 71 ad 80 bisognerà avere 19 punti ( esempi.: asso, re, cavallo e 6
+oppure tre, re, fante, 7, 6 e 5 );
+Per chiamate da 81 a 90 bisognerà avere 23 punti ( esempi.: asso, tre e fante oppure
+asso, re, cavallo, fante, 6, 5 e 4);
+Per chiamate da 91 a 100 bisognerà avere 25 punti ( esempi.: asso, tre, re e 7 oppure
+asso, tre, cavallo e fante );
+Per chiamate da 101 a 120 bisognerà avere 28 punti ( esempi.:asso, tre, re e cavallo
+oppure asso, tre, cavallo, 7, 6, 5 e 4 ).
+        */
+
+        $index_cur = $this->table->gstart % BIN5_PLAYERS_N;
+
+        // Abbandono dell'asta
+        if ($a_card <= -1) {
+            log_wr("Abbandona l'asta.");
+            $this->table->asta_pla[$index_cur] = FALSE;
+            $user->asta_card  = -1;
+            $this->table->asta_pla_n--;
+
+            if ($this->table->asta_card == -1 && $this->table->asta_pla_n == 1) {
+                // all abandon auction except one => move next bid to two and 71 points
+                $this->table->asta_card = 9;
+                $this->table->asta_pnt = 70;
+            }
+
+            return TRUE;
+        }
+        else if ($a_card <= 9) {
+            $ret_s = "";
+
+            do {
+                if ($a_card >= 0 && $a_card < 9 && $a_card > $this->table->asta_card) {
+                    ;
+                }
+                else if ($a_card == 9 &&
+                         $a_pnt > ($this->table->asta_pnt >= 61 ? $this->table->asta_pnt : 60)
+                         && $a_pnt <= 120) {
+                    $min_pts = $this->min_tourn_points($a_pnt);
+
+                    $max_hand_pts = $this->tourn_points_max($user);
+                    if ($max_hand_pts < $min_pts) {
+                        // FIXME_LANG
+                        $ret_s = sprintf("Hai chiamato un due a %d ma in mano hai al massimo %d punti-torneo, non puoi.",
+                                         $a_pnt, $max_hand_pts);
+                        break;
+                    }
+                }
+                else {
+                    break;
+                }
+
+                $user->asta_card  = $a_card;
+                $this->table->asta_card = $a_card;
+                if ($a_card == 9) {
+                    $user->asta_pnt   = $a_pnt;
+                    $this->table->asta_pnt  = $a_pnt;
+                }
+
+                return TRUE;
+            } while (0);
+        }
+
+        return FALSE;
+    }
+
+    function rules_nextauct(&$bri, $curtime, $action, $user, $maxcard)
+    {
+        if (($this->table->asta_pla_n > ($maxcard > -1 ? 1 : 0)) &&
+            !($this->table->asta_card == 9 && $this->table->asta_pnt == 120)) {
+            return TRUE;
+        }
+        else {
+            return FALSE;
+        }
+
+    }
+
+    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;
+    }
+
+
+    static function game_description($act, $form, $old_mult, $win = -1, $win_name = "?1?", $fri = -1, $fri_name = "?2?",
+                              $old_pnt = -1, $old_asta_pnt = -1, $old_tourn_pts = -1)
+    {
+        GLOBAL $G_lang, $mlang_bin5_rules, $mlang_bin5_toge17_rules;
+
+        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_rules['info_alpa'][$G_lang],
+                            $tg_br, $tg_hr, $tg_bo, $tg_bc));
+        }
+        else if ($act == BIN5_RULES_ABANDON) {
+            return (sprintf($mlang_bin5_rules['info_aban'][$G_lang],
+                            $tg_br, $tg_hr, $tg_bo, $tg_bc,
+                            $win_name));
+        }
+        else {
+            $wol = static::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_toge17_rules['info_part'][$G_lang],
+                                 $tg_br, $tg_hr, $tg_bo, $tg_bc,
+                                 $win_name,
+                                 $fri_name,
+                                 $old_tourn_pts);
+                if ($old_pnt == 120) {
+                    $noty .= sprintf($mlang_bin5_rules['info_capp'][$G_lang],
+                                     $tg_br, $tg_hr, $tg_bo, $tg_bc );
+                }
+                else {
+                    if ($old_asta_pnt > 61) {
+                        $noty .= sprintf($mlang_bin5_rules['info_alea'][$G_lang],
+                                         $tg_br, $tg_hr, $tg_bo, $tg_bc,
+                                         $old_asta_pnt, $old_pnt,
+                                         ($wol == 1 ? $mlang_bin5_rules['info_win'][$G_lang] :
+                                          ($wol == 0 ? $mlang_bin5_rules['info_peer'][$G_lang] :
+                                           $mlang_bin5_rules['info_lost'][$G_lang])));
+                    }
+                    else {
+                        $noty .= sprintf($mlang_bin5_rules['info_more'][$G_lang],
+                                         $tg_br, $tg_hr, $tg_bo, $tg_bc,
+                                         $old_pnt,
+                                         ($wol == 1 ? $mlang_bin5_rules['info_win'][$G_lang] :
+                                          ($wol == 0 ? $mlang_bin5_rules['info_peer'][$G_lang] :
+                                           $mlang_bin5_rules['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_toge17_rules['info_alon'][$G_lang],
+                                 $tg_br, $tg_hr, $tg_bo, $tg_bc,
+                                 $win_name,
+                                 $old_tourn_pts);
+                if ($old_pnt == 120) {
+                    $noty .= sprintf($mlang_bin5_rules['info_acap'][$G_lang],
+                                     $tg_br, $tg_hr, $tg_bo, $tg_bc);
+                }
+                else {
+                    if ($old_asta_pnt > 61) {
+                        $noty .= sprintf($mlang_bin5_rules['info_aleaa'][$G_lang],
+                                         $tg_br, $tg_hr, $tg_bo, $tg_bc,
+                                         $old_asta_pnt, $old_pnt,
+                                         ($wol == 1 ? $mlang_bin5_rules['info_win'][$G_lang] :
+                                          ($wol == 0 ? $mlang_bin5_rules['info_peer'][$G_lang] :
+                                           $mlang_bin5_rules['info_lost'][$G_lang])));
+                    }
+                    else {
+                        $noty .= sprintf($mlang_bin5_rules['info_morea'][$G_lang],
+                                         $tg_br, $tg_hr, $tg_bo, $tg_bc,
+                                         $old_pnt,
+                                         ($wol == 1 ? $mlang_bin5_rules['info_win'][$G_lang] :
+                                          ($wol == 0 ? $mlang_bin5_rules['info_peer'][$G_lang] :
+                                           $mlang_bin5_rules['info_lost'][$G_lang])));
+                    }
+                }
+            }
+        }
+
+        $old_multer = static::s_multer($old_mult, $old_asta_pnt);
+        if ($old_multer > 1) {
+            $noty .= sprintf($mlang_bin5_rules['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);
+    }
+} // class Rules_no_draw
+
+?>
\ No newline at end of file
index f67dd49..4b29178 100644 (file)
@@ -353,3 +353,13 @@ function preferences_showhide()
     else
         $('preferences').style.visibility = 'hidden';
 }
+
+function act_select_rules(rule_id)
+{
+    send_mesg("chatt|/rules " + rule_id);
+}
+
+function rules_set(id)
+{
+    $('select_rules').value = id;
+}
index 80f7366..64e7bc5 100644 (file)
@@ -121,6 +121,8 @@ window.onload = function() {
   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);
@@ -305,6 +307,9 @@ window.onload = function() {
 <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>
 
 
index bc69682..09c030a 100644 (file)
@@ -34,6 +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);
 
@@ -50,15 +51,11 @@ function bin5_index_wr_main(&$bin5, $remote_addr_full, $get, $post, $cookie)
 
     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) {
         echo "Get User Error";
         log_wr("Get User Error");
@@ -172,33 +169,7 @@ function bin5_index_wr_main(&$bin5, $remote_addr_full, $get, $post, $cookie)
         }
         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)) {
                     for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                         $user_cur = &$bin5->user[$table->player[$i]];
 
@@ -210,199 +181,221 @@ function bin5_index_wr_main(&$bin5, $remote_addr_full, $get, $post, $cookie)
                 }
             }
             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') {
@@ -490,7 +483,7 @@ function bin5_index_wr_main(&$bin5, $remote_addr_full, $get, $post, $cookie)
                     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)) {
                             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);
index d96cb6c..8d3dd3e 100644 (file)
@@ -40,11 +40,8 @@ curl -d "pazz=$BRISK_PASS" "http://$BRISK_SITE/briskin5/stat-day.php?from=$(date
 
 $G_base = "../";
 
-$mlang_stat_day = array( 'normal match'=> array( 'it' => 'Partite normali',
-                                                 'en' => 'Normal matches' ),
-                         'special match' => array( 'it' => 'Partite speciali',
-                                                   'en' => 'Special matches'),
-
+// SYNC WITH bin5_tournaments table
+$mlang_stat_day = array(
                          'info_total'=> array( 'it' => 'totali',
                                                'en' => 'En totali')
                          );
@@ -59,178 +56,6 @@ require_once("../Obj/dbase_${G_dbasetype}.phh");
 require_once("Obj/briskin5.phh");
 require_once("Obj/placing.phh");
 
-function main_file($curtime)
-{
-    GLOBAL $G_lang, $G_alarm_passwd;
-  $tri = array();
-  $mon = array();
-  $wee = array();
-
-  if (($fp = @fopen(LEGAL_PATH."/points.log", 'r')) == FALSE) {
-    echo "Open data file error";
-    exit;
-  }
-  echo "prima<br>";
-
-  if (($fp_start = @fopen(LEGAL_PATH."/points.start", 'r')) != FALSE) {
-    $skip = intval(fgets($fp_start));
-    if ($skip > 0)
-      fseek($fp, $skip, SEEK_SET);
-    fclose($fp_start);
-  }
-
-  if (($bdb = BriskDB::create()) == FALSE) {
-    echo "database connection failed";
-    exit;
-  }
-
-  $bdb->users_load();
-
-  for ($i = 0 ; $i < $bdb->count() ; $i++) {
-    $login = $bdb->getlogin_byidx($i);
-    $tri[$i] = new Ptsgam($login);
-    $mon[$i] = new Ptsgam($login);
-    $wee[$i] = new Ptsgam($login);
-  }
-
-  // recalculate all the placings
-  // 1246428948|492e4e9e856b0|N|tre|172.22.1.90|STAT:BRISKIN5:FINISH_GAME|4a4afd4983039|6|3|tre|1|due|2|uno|-1|
-  while (!feof($fp)) {
-    $p = 0;
-    $bf = fgets($fp, 4096);
-    $ar = csplitter($bf, '|');
-    // if not auth table, continue
-    if (count($ar) < 15)
-      continue;
-
-    // echo $p++."<br>";
-    if ($ar[7] >= TABLES_AUTH_N)
-      continue;
-    // echo $p++." ".$ar[5]."<br>";
-    // if not FINISH_GAME line, continue
-    if ($ar[5] != "STAT:BRISKIN5:FINISH_GAME")
-      continue;
-    // echo $p++."<br>";
-    // if to much old points, continue
-    if ($ar[0] < $curtime - TRI_LIMIT) {
-      if (($fp_start = @fopen(LEGAL_PATH."/points.start", 'w')) != FALSE) {
-        $curpos = ftell($fp);
-        fwrite($fp_start, sprintf("%d\n", $curpos));
-        fclose($fp_start);
-      }
-
-      continue;
-    }
-    // echo $p++." ".BIN5_PLAYERS_N."<br>";
-
-    $found = FALSE;
-    $mult = 1;
-    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-      for ($e = $i + 1 ; $e < BIN5_PLAYERS_N ; $e++) {
-        if ($ar[10+($i*2)] == $ar[10+($e*2)]) {
-          $mult = abs($ar[10+($i*2)]);
-          $found = TRUE;
-        }
-      }
-      if ($found)
-        break;
-    }
-
-    if ($mult == 0)
-       continue;
-    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-      // echo $p." i) ".$i."<br>";
-      $username = $ar[9+($i*2)];
-      if (($item = $bdb->getitem_bylogin($username, $id)) == FALSE) {
-        echo "WARNING: the user [".$username."] NOT EXISTS!<br>";
-        continue;
-      }
-
-      // echo $item->login." id)".$id."  ".$ar[10+($i*2)]." mult: ".$mult."<br>";
-      $tri[$id]->add($ar[10+($i*2)] / $mult);
-      if ($ar[0] >= $curtime - MON_LIMIT)
-        $mon[$id]->add($ar[10+($i*2)] / $mult);
-      if ($ar[0] >= $curtime - WEE_LIMIT)
-        $wee[$id]->add($ar[10+($i*2)] / $mult);
-    }
-    // $p++; echo $p++."<br>";
-  }
-  fclose($fp);
-
-  usort($tri, ptsgam_cmp);
-  usort($mon, ptsgam_cmp);
-  usort($wee, ptsgam_cmp);
-
-  echo "<br><br>TRI<br>\n";
-
-  if (($fplo = @fopen(LEGAL_PATH."/class_tri_lo.log", 'w')) == FALSE) {
-    echo "Open tri_lo failed<br>";
-    exit;
-  }
-  if (($fphi = @fopen(LEGAL_PATH."/class_tri_hi.log", 'w')) == FALSE) {
-    echo "Open tri_hi failed<br>";
-    exit;
-  }
-
-  for ($i = 0 ; $i < count($tri) ; $i++) {
-    if ($tri[$i]->gam == 0.0)
-      continue;
-    printf("%s: %s (%d) <br>\n",  $tri[$i]->username,  $tri[$i]->snormpts(), $tri[$i]->gam);
-    if ($tri[$i]->gam >= TRI_MAX_GAMES)
-      fwrite($fphi, sprintf("%s|%d|%d|\n", xcapelt($tri[$i]->username), $tri[$i]->pts, $tri[$i]->gam));
-    else if ($tri[$i]->gam > TRI_MIN_GAMES)
-      fwrite($fplo, sprintf("%s|%d|%d|\n", xcapelt($tri[$i]->username), $tri[$i]->pts, $tri[$i]->gam));
-  }
-  fclose($fphi);
-  fclose($fplo);
-
-  echo "<br><br>MON<br>\n";
-
-  if (($fplo = @fopen(LEGAL_PATH."/class_mon_lo.log", 'w')) == FALSE) {
-    echo "Open tri_lo failed<br>";
-    exit;
-  }
-  if (($fphi = @fopen(LEGAL_PATH."/class_mon_hi.log", 'w')) == FALSE) {
-    echo "Open tri_hi failed<br>";
-    exit;
-  }
-
-  for ($i = 0 ; $i < count($mon) ; $i++) {
-    if ($mon[$i]->gam == 0.0)
-      continue;
-    printf("%s: %s (%d) <br>\n",  $mon[$i]->username,  $mon[$i]->snormpts(), $mon[$i]->gam);
-    if ($mon[$i]->gam >= MON_MAX_GAMES)
-      fwrite($fphi, sprintf("%s|%d|%d|\n", xcapelt($mon[$i]->username), $mon[$i]->pts, $mon[$i]->gam));
-    else if ($mon[$i]->gam > MON_MIN_GAMES)
-      fwrite($fplo, sprintf("%s|%d|%d|\n", xcapelt($mon[$i]->username), $mon[$i]->pts, $mon[$i]->gam));
-  }
-  fclose($fphi);
-  fclose($fplo);
-
-  echo "<br><br>WEE<br>\n";
-  if (($fplo = @fopen(LEGAL_PATH."/class_wee_lo.log", 'w')) == FALSE) {
-    echo "Open wee_lo failed<br>";
-    exit;
-  }
-  if (($fphi = @fopen(LEGAL_PATH."/class_wee_hi.log", 'w')) == FALSE) {
-    echo "Open wee_hi failed<br>";
-    exit;
-  }
-
-  for ($i = 0 ; $i < count($wee) ; $i++) {
-    if ($wee[$i]->gam == 0.0)
-      continue;
-    printf("%s: %s (%d) <br>\n",  $wee[$i]->username,  $wee[$i]->snormpts(), $wee[$i]->gam);
-    if ($wee[$i]->gam >= WEE_MAX_GAMES)
-      fwrite($fphi, sprintf("%s|%d|%d|\n", xcapelt($wee[$i]->username), $wee[$i]->pts, $wee[$i]->gam));
-    else if ($wee[$i]->gam > WEE_MIN_GAMES)
-      fwrite($fplo, sprintf("%s|%d|%d|\n", xcapelt($wee[$i]->username), $wee[$i]->pts, $wee[$i]->gam));
-  }
-  fclose($fphi);
-  fclose($fplo);
-
-}
-
 function main_pgsql($from, $to)
 {
     GLOBAL $G_lang, $G_dbpfx, $mlang_stat_day;
@@ -252,10 +77,10 @@ function main_pgsql($from, $to)
             break;
         }
 
-        if (pg_query($bdb->dbconn->db(), "BEGIN") == FALSE) {
-            log_crit("stat-day: begin failed");
-            break;
-        }
+        //if ($bdb->transaction("BEGIN") == FALSE) {
+        //    log_crit("stat-day: begin failed");
+        //    break;
+        //}
 
         // retrieve list of active tournaments
         $trn_sql = sprintf("SELECT * FROM %sbin5_tournaments WHERE active = 1;", $G_dbpfx);
@@ -295,12 +120,8 @@ SELECT m.code AS code, m.mazzo_next as minus_one_is_old
             if ($tmt_n == 0)
                 continue;
 
-            if (!isset($mlang_stat_day[$trn_obj->name][$G_lang])) {
-                log_crit("stat-day: tournament name not found in array");
-                break;
-            }
-            printf("[Tournament [%s]], number of matches: %d\n", $mlang_stat_day[$trn_obj->name][$G_lang], $tmt_n);
-            fprintf($fpexp, "<h3>%s</h3>", $mlang_stat_day[$trn_obj->name][$G_lang]);
+            printf("[Tournament [%s]], number of matches: %d\n", rules_id2descr($trn_obj->code, $G_lang), $tmt_n);
+            fprintf($fpexp, "<h2 style=\"padding: 8px; background-color: pink;\">%s</h2>", xcape(ucfirst(rules_id2descr($trn_obj->code, $G_lang))));
 
             // loop on matches
             for ($m = 0 ; $m < $tmt_n ; $m++) {
@@ -422,19 +243,21 @@ SELECT p.pts AS pts
 
                         fprintf($fpexp, "<%s class='%s'>%d</%s>",
                                 ($tmt_obj->minus_one_is_old == -1 ? "td" : "th"),
-                                $cla_nam, pow(2,$gam_obj->mult) * $pts,
+                                $cla_nam,
+                                pow(2,$gam_obj->mult) * $pts,
                                 ($tmt_obj->minus_one_is_old == -1 ? "td" : "th"));
                     }
                     if ($tmt_obj->minus_one_is_old != -1) {
+                        $rules_name = rules_id2name($trn_obj->code);
                         fprintf($fpexp, "<td>%s</td><td>%s</td>", $users[$gam_obj->mazzo]['login'],
-                                xcape( game_description($gam_obj->act, 'plain', $gam_obj->mult,
+                                xcape( ${rules_name}::game_description($gam_obj->act, 'plain', $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->pnt, $gam_obj->asta_pnt, $gam_obj->tourn_pts) )
                                 );
                     }
                     fprintf($fpexp, "</tr>\n");
@@ -470,15 +293,18 @@ SELECT sum(p.pts * (2^g.mult)) AS pts
             }
         }
         if ($t < $trn_n) {
-            log_crit("stat-day: t < trn_n");
+            log_crit(sprintf("stat-day: t < trn_n (%d, %d)", $t, $trn_n));
             break;
         }
+        // if ($bdb->transaction("COMMIT") == FALSE) {
+        //     break;
+        // }
         $ret = (TRUE);
     } while (0);
 
-    if ($ret == FALSE) {
-        pg_query($bdb->dbconn->db(), "ROLLBACK");
-    }
+    // if ($ret == FALSE) {
+    //    $bdb->transaction("ROLLBACK");
+    // }
     if ($fpexp != FALSE) {
         fclose($fpexp);
     }
index a65acef..71d2321 100644 (file)
@@ -3,7 +3,7 @@
  *  brisk - statadm.php
  *
  *  Copyright (C) 2009-2012 Matteo Nastasi
- *                          mailto: nastasi@alternativeoutput.it 
+ *                          mailto: nastasi@alternativeoutput.it
  *                                  matteo.nastasi@milug.org
  *                          web: http://www.alternativeoutput.it
  *
 /*
   line example:
 1246428948|492e4e9e856b0|N|tre|172.22.1.90|STAT:BRISKIN5:FINISH_GAME|4a4afd4983039|6|3|tre|1|due|2|uno|-1|
-   
+
 */
 
 $G_base = "../";
 
-define('BIN5_TOURNAMENT_NORMAL', 1);
-
 ini_set("max_execution_time",  "240");
 
 require_once("../Obj/brisk.phh");
@@ -41,178 +39,6 @@ require_once("../Obj/dbase_${G_dbasetype}.phh");
 require_once("Obj/briskin5.phh");
 require_once("Obj/placing.phh");
 
-function main_file($curtime)
-{
-  GLOBAL $G_alarm_passwd;
-  $tri = array();
-  $mon = array();
-  $wee = array();
-  
-  if (($fp = @fopen(LEGAL_PATH."/points.log", 'r')) == FALSE) {
-    echo "Open data file error";
-    exit;
-  }
-  echo "prima<br>";
-  if (($fp_start = @fopen(LEGAL_PATH."/points.start", 'r')) != FALSE) {
-    $skip = intval(fgets($fp_start));
-    if ($skip > 0)
-      fseek($fp, $skip, SEEK_SET);
-    fclose($fp_start);
-  }
-
-  if (($bdb = BriskDB::create()) == FALSE) {
-    echo "database connection failed";
-    exit;
-  }
-      
-  $bdb->users_load();
-
-  for ($i = 0 ; $i < $bdb->count() ; $i++) {
-    $login = $bdb->getlogin_byidx($i);
-    $tri[$i] = new Ptsgam($login);
-    $mon[$i] = new Ptsgam($login);
-    $wee[$i] = new Ptsgam($login);
-  }
-
-  // recalculate all the placings
-  // 1246428948|492e4e9e856b0|N|tre|172.22.1.90|STAT:BRISKIN5:FINISH_GAME|4a4afd4983039|6|3|tre|1|due|2|uno|-1|
-  while (!feof($fp)) {
-    $p = 0;
-    $bf = fgets($fp, 4096);
-    $ar = csplitter($bf, '|');
-    // if not auth table, continue
-    if (count($ar) < 15)
-      continue;
-    
-    // echo $p++."<br>";
-    if ($ar[7] >= TABLES_AUTH_N)
-      continue;
-    // echo $p++." ".$ar[5]."<br>";
-    // if not FINISH_GAME line, continue
-    if ($ar[5] != "STAT:BRISKIN5:FINISH_GAME")
-      continue;
-    // echo $p++."<br>";
-    // if to much old points, continue
-    if ($ar[0] < $curtime - TRI_LIMIT) {
-      if (($fp_start = @fopen(LEGAL_PATH."/points.start", 'w')) != FALSE) {
-        $curpos = ftell($fp);
-        fwrite($fp_start, sprintf("%d\n", $curpos));
-        fclose($fp_start);
-      }
-      
-      continue;
-    }
-    // echo $p++." ".BIN5_PLAYERS_N."<br>";
-    
-    $found = FALSE;
-    $mult = 1;
-    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-      for ($e = $i + 1 ; $e < BIN5_PLAYERS_N ; $e++) {
-        if ($ar[10+($i*2)] == $ar[10+($e*2)]) {
-          $mult = abs($ar[10+($i*2)]);
-          $found = TRUE;
-        }
-      }
-      if ($found)
-        break;
-    }
-
-    if ($mult == 0)
-       continue;
-    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-      // echo $p." i) ".$i."<br>";
-      $username = $ar[9+($i*2)];
-      if (($item = $bdb->getitem_bylogin($username, $id)) == FALSE) {
-        echo "WARNING: the user [".$username."] NOT EXISTS!<br>";
-        continue;
-      }
-      
-      // echo $item->login." id)".$id."  ".$ar[10+($i*2)]." mult: ".$mult."<br>";
-      $tri[$id]->add($ar[10+($i*2)] / $mult);
-      if ($ar[0] >= $curtime - MON_LIMIT) 
-        $mon[$id]->add($ar[10+($i*2)] / $mult);
-      if ($ar[0] >= $curtime - WEE_LIMIT) 
-        $wee[$id]->add($ar[10+($i*2)] / $mult);
-    }
-    // $p++; echo $p++."<br>";
-  }
-  fclose($fp);
-  
-  usort($tri, ptsgam_cmp);
-  usort($mon, ptsgam_cmp);
-  usort($wee, ptsgam_cmp);
-  
-  echo "<br><br>TRI<br>\n";
-
-  if (($fplo = @fopen(LEGAL_PATH."/class_tri_lo.log", 'w')) == FALSE) {
-    echo "Open tri_lo failed<br>";
-    exit;
-  }
-  if (($fphi = @fopen(LEGAL_PATH."/class_tri_hi.log", 'w')) == FALSE) {
-    echo "Open tri_hi failed<br>";
-    exit;
-  }
-
-  for ($i = 0 ; $i < count($tri) ; $i++) {
-    if ($tri[$i]->gam == 0.0)
-      continue;
-    printf("%s: %s (%d) <br>\n",  $tri[$i]->username,  $tri[$i]->snormpts(), $tri[$i]->gam);
-    if ($tri[$i]->gam >= TRI_MAX_GAMES) 
-      fwrite($fphi, sprintf("%s|%d|%d|\n", xcapelt($tri[$i]->username), $tri[$i]->pts, $tri[$i]->gam));
-    else if ($tri[$i]->gam > TRI_MIN_GAMES) 
-      fwrite($fplo, sprintf("%s|%d|%d|\n", xcapelt($tri[$i]->username), $tri[$i]->pts, $tri[$i]->gam));
-  }
-  fclose($fphi);
-  fclose($fplo);
-
-  echo "<br><br>MON<br>\n";
-
-  if (($fplo = @fopen(LEGAL_PATH."/class_mon_lo.log", 'w')) == FALSE) {
-    echo "Open tri_lo failed<br>";
-    exit;
-  }
-  if (($fphi = @fopen(LEGAL_PATH."/class_mon_hi.log", 'w')) == FALSE) {
-    echo "Open tri_hi failed<br>";
-    exit;
-  }
-
-  for ($i = 0 ; $i < count($mon) ; $i++) {
-    if ($mon[$i]->gam == 0.0)
-      continue;
-    printf("%s: %s (%d) <br>\n",  $mon[$i]->username,  $mon[$i]->snormpts(), $mon[$i]->gam);
-    if ($mon[$i]->gam >= MON_MAX_GAMES) 
-      fwrite($fphi, sprintf("%s|%d|%d|\n", xcapelt($mon[$i]->username), $mon[$i]->pts, $mon[$i]->gam));
-    else if ($mon[$i]->gam > MON_MIN_GAMES) 
-      fwrite($fplo, sprintf("%s|%d|%d|\n", xcapelt($mon[$i]->username), $mon[$i]->pts, $mon[$i]->gam));
-  }
-  fclose($fphi);
-  fclose($fplo);
-
-  echo "<br><br>WEE<br>\n";
-  if (($fplo = @fopen(LEGAL_PATH."/class_wee_lo.log", 'w')) == FALSE) {
-    echo "Open wee_lo failed<br>";
-    exit;
-  }
-  if (($fphi = @fopen(LEGAL_PATH."/class_wee_hi.log", 'w')) == FALSE) {
-    echo "Open wee_hi failed<br>";
-    exit;
-  }
-
-  for ($i = 0 ; $i < count($wee) ; $i++) {
-    if ($wee[$i]->gam == 0.0) 
-      continue;
-    printf("%s: %s (%d) <br>\n",  $wee[$i]->username,  $wee[$i]->snormpts(), $wee[$i]->gam);
-    if ($wee[$i]->gam >= WEE_MAX_GAMES) 
-      fwrite($fphi, sprintf("%s|%d|%d|\n", xcapelt($wee[$i]->username), $wee[$i]->pts, $wee[$i]->gam));
-    else if ($wee[$i]->gam > WEE_MIN_GAMES) 
-      fwrite($fplo, sprintf("%s|%d|%d|\n", xcapelt($wee[$i]->username), $wee[$i]->pts, $wee[$i]->gam));
-  }
-  fclose($fphi);
-  fclose($fplo);
-
-}
-
 function main_pgsql($curtime)
 {
     GLOBAL $G_dbpfx;
@@ -227,20 +53,20 @@ function main_pgsql($curtime)
     $maxg = array( TRI_MAX_GAMES, MON_MAX_GAMES, WEE_MAX_GAMES );
 
     do {
-        if (pg_query($bdb->dbconn->db(), "BEGIN") == FALSE) {
+        if ($bdb->transaction("BEGIN") == FALSE) {
             log_crit("statadm: begin failed");
             break;
         }
-        
-        $mtc_sql = sprintf("CREATE TEMPORARY TABLE %sbin5_temp_matches ON COMMIT DROP AS SELECT m.code, max(g.tstamp) AS tstamp 
-                            FROM %sbin5_matches as m, %sbin5_games as g 
-                            WHERE m.tcode = %d AND m.code = g.mcode GROUP BY m.code, m.ttok",
-                           $G_dbpfx, $G_dbpfx, $G_dbpfx, BIN5_TOURNAMENT_NORMAL);
+
+        $mtc_sql = sprintf("CREATE TEMPORARY TABLE %sbin5_temp_matches ON COMMIT DROP AS SELECT m.code, max(g.tstamp) AS tstamp
+                            FROM %sbin5_matches as m, %sbin5_games as g
+                            WHERE (m.tcode = %d OR m.tcode = %d) AND m.code = g.mcode GROUP BY m.code, m.ttok",
+                           $G_dbpfx, $G_dbpfx, $G_dbpfx, BIN5_TOURNAMENT_OLDRULES, BIN5_TOURNAMENT_NO_DRAW);
         if (pg_query($bdb->dbconn->db(), $mtc_sql) == FALSE) {
             log_crit("statadm: temporary matches table creation [$mtc_sql] failed");
             break;
         }
-        
+
         $tmt_sql = sprintf("SELECT * FROM %sbin5_temp_matches WHERE  tstamp < to_timestamp(%d)",
                            $G_dbpfx, $curtime - TRI_LIMIT);
 
@@ -254,39 +80,40 @@ function main_pgsql($curtime)
                 log_crit("statadm: log file [$fname] open failed");
                 break;
             }
-            
+
             $tmt_n = pg_numrows($tmt_pg);
             // get matches
             for ($m = 0 ; $m < $tmt_n ; $m++) {
                 $tmt_obj = pg_fetch_object($tmt_pg, $m);
-                
+
                 $mtc_sql = sprintf("SELECT * from %sbin5_matches WHERE code = %d",
                                    $G_dbpfx, $tmt_obj->code);
-                
+
                 if (($mtc_pg  = pg_query($bdb->dbconn->db(), $mtc_sql)) == FALSE || pg_numrows($mtc_pg) != 1) {
                     log_crit("statadm: matches row select failed");
                     break;
                 }
                 $mtc_obj = pg_fetch_object($mtc_pg, 0);
-                
-                if (fwrite($fp, sprintf("M|%d|%s|%d|\n", $mtc_obj->code, xcapelt($mtc_obj->ttok), $mtc_obj->tidx)) == FALSE) {
+
+                if (fwrite($fp, sprintf("M|%d|%s|%d|%d|\n", $mtc_obj->code, xcapelt($mtc_obj->ttok),
+                                        $mtc_obj->tidx, $mtc_obj->tcode)) == FALSE) {
                     log_crit("statadm: log file [$fname] write match failed");
                     break;
                 }
-                
+
                 // get games associated to each match
-                $gam_sql = sprintf("SELECT code, mcode, EXTRACT(epoch FROM tstamp) AS tstamp FROM %sbin5_games 
+                $gam_sql = sprintf("SELECT code, mcode, EXTRACT(epoch FROM tstamp) AS tstamp FROM %sbin5_games
                                     WHERE mcode = %d ORDER BY tstamp",
                                    $G_dbpfx, $mtc_obj->code);
                 if (($gam_pg  = pg_query($bdb->dbconn->db(), $gam_sql)) == FALSE) {
                     log_crit("statadm: games row select failed");
                     break;
                 }
-                
+
                 $gam_n = pg_numrows($gam_pg);
                 for ($g = 0 ; $g < $gam_n ; $g++) {
                     $gam_obj = pg_fetch_object($gam_pg, $g);
-                    
+
                     if (fwrite($fp, sprintf("G|%d|%d|%d|\n", $gam_obj->mcode, $gam_obj->code, $gam_obj->tstamp)) == FALSE) {
                         log_crit("statadm: log file [$fname] write game failed");
                         break;
@@ -299,7 +126,7 @@ function main_pgsql($curtime)
                     $pts_n = pg_numrows($pts_pg);
                     for ($p = 0 ; $p < $pts_n ; $p++) {
                         $pts_obj = pg_fetch_object($pts_pg, $p);
-                        
+
                         if (fwrite($fp, sprintf("P|%d|%d|%d|\n", $pts_obj->gcode, $pts_obj->ucode, $pts_obj->pts)) == FALSE) {
                             log_crit("statadm: log file [$fname] write pts failed");
                             break;
@@ -310,7 +137,7 @@ function main_pgsql($curtime)
                 }
                 if ($g < $gam_n)
                     break;
-                
+
                 // delete match and all it's childs (games and points)
                 $del_sql = sprintf("DELETE FROM %sbin5_matches WHERE code = %d",
                                    $G_dbpfx, $tmt_obj->code);
@@ -318,7 +145,7 @@ function main_pgsql($curtime)
                     log_crit("statadm: matches row deletion failed");
                     break;
                 }
-                
+
             }
             if ($m < $tmt_n)
                 break;
@@ -330,7 +157,7 @@ function main_pgsql($curtime)
             log_crit("statadm: truncate failed");
             break;
         }
-        
+
         for ($dtime = 0 ; $dtime < count($limi) ; $dtime++) {
             $old_score = array( 1000000000, 1000000000);
             $old_gam   = array( -1, -1);
@@ -338,16 +165,17 @@ function main_pgsql($curtime)
 
             // TAG: POINTS_MANAGEMENT
             $pla_sql = sprintf("SELECT (float4(sum(p.pts)) * 100.0 ) /  float4(count(p.pts)) as score, sum(p.pts) as points, count(p.pts) as games, u.code as ucode, u.login as login
-                                FROM %sbin5_points as p, %sbin5_games as g, %sbin5_matches as m, %susers as u 
-                                WHERE m.tcode = %d AND m.code = g.mcode AND
+                                FROM %sbin5_points as p, %sbin5_games as g, %sbin5_matches as m, %susers as u
+                                WHERE (m.tcode = %d OR m.tcode = %d) AND m.code = g.mcode AND
                                       ( (u.type & (CAST (X'ff0000' as integer))) <> (CAST (X'800000' as integer)) ) AND
                                       g.tstamp > to_timestamp(%d) AND g.tstamp <= to_timestamp(%d) AND
                                       p.ucode = u.code AND p.gcode = g.code AND
                                       p.pts != 0
                                 GROUP BY u.code, u.login
-                                ORDER BY (float4(sum(p.pts)) * 100.0 ) /  float4(count(p.pts)) DESC, 
+                                ORDER BY (float4(sum(p.pts)) * 100.0 ) /  float4(count(p.pts)) DESC,
                                          count(p.pts) DESC",
-                               $G_dbpfx, $G_dbpfx, $G_dbpfx, $G_dbpfx, BIN5_TOURNAMENT_NORMAL,
+                               $G_dbpfx, $G_dbpfx, $G_dbpfx, $G_dbpfx,
+                               BIN5_TOURNAMENT_OLDRULES, BIN5_TOURNAMENT_NO_DRAW,
                                $curtime - $limi[$dtime], $curtime);
 
             // log_crit("statadm: INFO: [$pla_sql]");
@@ -357,7 +185,7 @@ function main_pgsql($curtime)
                 log_crit("statadm: main placement select failed [$pla_sql]");
                 break;
             }
-            
+
             for ($i = 0 ; $i < pg_numrows($pla_pg) ; $i++) {
                 $pla_obj = pg_fetch_object($pla_pg,$i);
                 if ($pla_obj->games < $ming[$dtime])
@@ -367,22 +195,22 @@ function main_pgsql($curtime)
                     $subty = 0;
                 else
                     $subty = 1;
-                
+
                 $ty = ($dtime * 2) + $subty;
-                
+
                 if ($pla_obj->games != $old_gam[$subty] || $pla_obj->score != $old_score[$subty]) {
                     $rank[$subty]++;
                 }
                 $new_sql = sprintf("INSERT INTO %sbin5_places (type, rank, ucode, login, pts, games, score)
                                     VALUES (%d, %d, %d, '%s', %d, %d, %f);",
-                                   $G_dbpfx, $ty, $rank[$subty], $pla_obj->ucode, escsql($pla_obj->login), 
+                                   $G_dbpfx, $ty, $rank[$subty], $pla_obj->ucode, escsql($pla_obj->login),
                                    $pla_obj->points, $pla_obj->games, $pla_obj->score);
-                if ( ! (($new_pg  = pg_query($bdb->dbconn->db(), $new_sql)) != FALSE && 
+                if ( ! (($new_pg  = pg_query($bdb->dbconn->db(), $new_sql)) != FALSE &&
                         pg_affected_rows($new_pg) == 1) ) {
                     log_crit("statadm: new place insert failed: ".print_r($pla_obj, TRUE));
-                    break;                        
+                    break;
                 }
-                
+
                 $old_gam[$subty]   = $pla_obj->games;
                 $old_score[$subty] = $pla_obj->score;
             } // for ($i = 0 ; $i < pg_numrows($pla_pg) ; $i++) {
@@ -396,19 +224,19 @@ function main_pgsql($curtime)
 
         $mti_sql = sprintf("UPDATE %sbin5_places_mtime SET mtime = (to_timestamp(%d)) WHERE code = 0;",
                            $G_dbpfx, $curtime);
-        if ( ! (($mti_pg  = pg_query($bdb->dbconn->db(), $mti_sql)) != FALSE && 
+        if ( ! (($mti_pg  = pg_query($bdb->dbconn->db(), $mti_sql)) != FALSE &&
                 pg_affected_rows($mti_pg) == 1) ) {
             log_crit("statadm: new mtime insert failed.");
-            break;                        
+            break;
         }
-        
-        if (pg_query($bdb->dbconn->db(), "COMMIT") == FALSE) {
+
+        if ($bdb->transaction("COMMIT") == FALSE) {
             break;
         }
         return (TRUE);
     } while (0);
 
-    pg_query($bdb->dbconn->db(), "ROLLBACK");
+    $bdb->transaction("ROLLBACK");
 
     return (FALSE);
 }
@@ -416,7 +244,7 @@ function main_pgsql($curtime)
 function main()
 {
     GLOBAL $G_dbasetype, $G_alarm_passwd, $pazz;
-    
+
     echo "Inizio.<br>";
     mop_flush();
     if ($pazz != $G_alarm_passwd) {
@@ -424,9 +252,9 @@ function main()
         mop_flush();
         exit;
     }
-    
+
     $fun_name = "main_${G_dbasetype}";
-    
+
     $ctime = time();
 
     if (BIN5_PLAYERS_N != 5)
@@ -437,7 +265,7 @@ function main()
         echo "Success.<br>\n";
     else
         echo "Failed.<br>\n";
-    
+
     echo "Fine.\n";
     mop_flush();
 }
index 155935a..478d880 100644 (file)
@@ -685,8 +685,9 @@ google_color_url = "000000";
 <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 +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>
index 02d8cd6..9f4946b 100644 (file)
@@ -138,7 +138,7 @@ table.placings td
 }
 
 table.placing {
-    background-image: url('img/najole_wh_light.png');
+    background-image: url('img/lines_light.png');
     background-attachment: fixed;
 
     border: 1px solid gray;
@@ -149,8 +149,14 @@ table.placing {
 
 table.placing th {
     border: 1px solid gray;
-    text-align: center;
-    padding: 4px;
+    text-align: right;
+    padding: 8px;
+    min-width: 50px;
+}
+
+table.placing th span {
+    font-weight: normal;
+    float: left;
 }
 
 table.placing td {
@@ -196,7 +202,7 @@ table.room_tab td {
     -moz-border-radius: 8px;
     border-radius: 8px;
 
-    background-image: url('img/najole_wh_light.png');
+    background-image: url('img/lines_light.png');
     background-attachment: fixed;
 
     width: 25%;
@@ -244,7 +250,7 @@ table.room_standup {
     border-spacing: 0px;
     padding: 0px;
 
-    background-image: url('img/najole_wh_light.png');
+    background-image: url('img/lines_light.png');
     background-attachment: fixed;
 }
 
@@ -264,7 +270,7 @@ table.login {
     border: 1px solid gray;
     margin-top: 8px;
 
-    background-image: url('img/najole_wh_light.png');
+    background-image: url('img/lines_light.png');
     background-attachment: fixed;
  }
 
@@ -316,7 +322,7 @@ div.esco {
     -moz-border-radius: 4px;
     border-radius: 4px;
 
-    background-image: url('img/najole_wh_light.png');
+    background-image: url('img/lines_light.png');
     background-attachment: fixed;
 }
 
index 38a3d2a..26d78e9 100644 (file)
@@ -639,7 +639,7 @@ function mesgtoadm_formtext_hilite(form)
 
 function j_check_email(email, ret)
 {
-    if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,10})+$/.test(email))
+    if (/^\w+([\.-]*\w+)*@\w+([\.-]*\w+)*(\.\w{2,10})+$/.test(email))
         return (true);
     ret.ret += (g_lang == 'en' ? "Invalid email address. " :
                 "Indirizzo e-mail non valido.");
index 3f52c36..307372c 100644 (file)
@@ -233,7 +233,8 @@ SELECT usr.*, guar.login AS guar_login
                     break;
                 }
             }
-        }
+        } // else if ($action == "accept") {
+
 
         do {
             if (($bdb = BriskDB::create()) == FALSE) {
@@ -489,6 +490,108 @@ SELECT usr.*, guar.login AS guar_login
             }
             exit;
         }
+
+
+        else if ($action == "delete") {
+            foreach($_POST as $key => $value) {
+                if (substr($key, 0, 9) != "f_newuser")
+                    continue;
+
+                $id = (int)substr($key, 9);
+                if ($id <= 0)
+                    continue;
+
+                // check existence of username or email
+                $is_trans = FALSE;
+                $res = FALSE;
+                do {
+                    if (($bdb = BriskDB::create()) == FALSE)
+                        break;
+
+                    // retrieve list added users
+                    $usr_sql = sprintf("
+SELECT usr.*, guar.login AS guar_login
+     FROM %susers AS usr
+     JOIN %susers AS guar ON guar.code = usr.guar_code
+     WHERE usr.type & (CAST (X'%x' as integer)) = (CAST (X'%x' as integer))
+         AND usr.disa_reas = %d AND usr.code = %d;",
+                               $G_dbpfx, $G_dbpfx,
+                                       USER_FLAG_TY_DISABLE, USER_FLAG_TY_DISABLE,
+                                       USER_DIS_REA_NU_TOBECHK, $id);
+
+
+                    if (($usr_pg = pg_query($bdb->dbconn->db(), $usr_sql)) == FALSE) {
+                        log_crit("stat-day: select from tournaments failed");
+                        break;
+                    }
+                    $usr_n = pg_numrows($usr_pg);
+                    if ($usr_n != 1) {
+                        $status .= sprintf("Inconsistency for code %d, returned %d records, skipped.<br>",
+                                          $id, $usr_n);
+                        break;
+                    }
+
+                    $usr_obj = pg_fetch_object($usr_pg, 0);
+
+                    $bdb->transaction('BEGIN');
+                    $is_trans = TRUE;
+
+                    $del_sql = sprintf("DELETE FROM %susers WHERE code = %d;",
+                                       $G_dbpfx, $usr_obj->code);
+
+                    if (($del_pg = pg_query($bdb->dbconn->db(), $del_sql)) == FALSE) {
+                        log_crit("stat-day: select from tournaments failed");
+                        break;
+                    }
+
+                    // FIXME: add to index_wr.php strings
+                    $subj = "Brisk: nickname rifiutato";
+                    // the same for both cases:
+                    //  if (($usr_obj->type & USER_FLAG_TY_APPR) == USER_FLAG_TY_APPR) {
+                        $body_txt = sprintf('Ciao, sono l\' amministratore del sito di Brisk.
+
+Ti volevo segnalare che il nickname \'%s\' con cui ti volevi registrare
+non ha superato la fase di verifica manuale; il motivo può essere
+la sua illeggibilità per gli altri utenti o il contenuto poco ortodosso
+o troppo aggressivo o o ci sono troppe cifre consecutive o qualcosa del genere.
+
+La procedura di registrazione va ripetuta.
+
+Saluti e buone partite, mop.', $usr_obj->login);
+
+                        $body_htm = sprintf('Ciao, sono l\' amministratore del sito di Brisk.<br><br>
+Ti volevo segnalare che il nickname \'%s\' con cui ti volevi registrare
+non ha superato la fase di verifica manuale; il motivo può essere
+la sua illeggibilità per gli altri utenti o il contenuto poco ortodosso
+o troppo aggressivo o o ci sono troppe cifre consecutive o qualcosa del genere.<br><br>
+La procedura di registrazione va ripetuta.<br><br>
+Saluti e buone partite, mop.', $usr_obj->login);
+                    /* } */
+                    /* else { */
+                    /*     $body_txt = sprintf($mlang_indwr['nu_mtext'][$G_lang], */
+                    /*                         $usr_obj->guar_login, $usr_obj->login, $confirm_page); */
+                    /*     $body_htm = sprintf($mlang_indwr['nu_mhtml'][$G_lang], */
+                    /*                         $usr_obj->guar_login, $usr_obj->login, $confirm_page); */
+                    /* } */
+
+                    if (brisk_mail($usr_obj->email, $subj, $body_txt, $body_htm) == FALSE) {
+                        // mail error
+                        fprintf(STDERR, "ERROR: mail send FAILED\n");
+                        break;
+                    }
+                    $status .= sprintf("user delete for %s: SUCCESS<br>", $usr_obj->login);
+                    $bdb->transaction('COMMIT');
+                    $res = TRUE;
+                } while(FALSE);
+                if ($res == FALSE) {
+                    $status .= sprintf("Error occurred during accept action<br>");
+                    if ($is_trans)
+                        $bdb->transaction('ROLLBACK');
+                    break;
+                }
+                printf("Registration %s for login %s deleted<br>\n", $usr_obj->code, $usr_obj->login);
+            }
+        }
         else {
             do {
             if (($bdb = BriskDB::create()) == FALSE) {