Merge branch 'tournaments' v4.10.0
authorMatteo Nastasi (mop) <nastasi@alternativeoutput.it>
Sun, 3 Nov 2013 08:57:52 +0000 (09:57 +0100)
committerMatteo Nastasi (mop) <nastasi@alternativeoutput.it>
Sun, 3 Nov 2013 08:57:52 +0000 (09:57 +0100)
30 files changed:
INSTALL.sh
TODO.txt
bin/3fire.sh [new file with mode: 0755]
bin/tagger.sh
doc/ARCHITECTURE.txt
sql/builder.sh
sql/sql.d/053-user-enh.sql
sql/sql.d/054-continue-match.sql [new file with mode: 0644]
sql/sql.d/060-tournament.sql [new file with mode: 0644]
sql/sql.d/100-anagr.sql.noinsert
web/Obj/brisk.phh
web/Obj/dbase_file.phh
web/Obj/dbase_pgsql.phh
web/Obj/sac-a-push.phh
web/Obj/transports.phh
web/Obj/user.phh
web/brisk.css
web/briskin5/Obj/briskin5.phh
web/briskin5/Obj/placing.phh
web/briskin5/briskin5.js
web/briskin5/dnd.js
web/briskin5/explain.php
web/briskin5/index_wr.php
web/briskin5/stat-day.php
web/briskin5/statadm.php
web/commons.js
web/index.php
web/index_wr.php
web/xynt-streaming.js
web/xynt_test01.php

index b021de5..4f96382 100755 (executable)
@@ -6,6 +6,7 @@
 CONFIG_FILE="$HOME/.brisk_install"
 
 apache_conf="/etc/apache2/sites-available/default"
+card_hand=3
 players_n=3
 tables_n=44
 tables_auth_n=12
@@ -29,12 +30,13 @@ function usage () {
     echo "$1 -h"
     echo "$1 chk                          - run lintian on all ph* files."
     echo "$1 pkg                          - build brisk packages."
-    echo "$1 [-W] [-n 3|5] [-t <(n>=4)>] [-T <auth_tab>] [-A <apache-conf>] [-a <auth_file_name>] [-f <conffile>] [-p <outconf>] [-U <usock_path>] [-u <sys_user>] [-d <TRUE|FALSE>] [-w <web_dir>] [-k <ftok_dir>] [-l <legal_path>] [-y <proxy_path>] [-P <prefix_path>]"
+    echo "$1 [-W] [-n 3|5] [-c 3|8] [-t <(n>=4)>] [-T <auth_tab>] [-A <apache-conf>] [-a <auth_file_name>] [-f <conffile>] [-p <outconf>] [-U <usock_path>] [-u <sys_user>] [-d <TRUE|FALSE>] [-w <web_dir>] [-k <ftok_dir>] [-l <legal_path>] [-y <proxy_path>] [-P <prefix_path>]"
     echo "  -h this help"
     echo "  -f use this config file"
     echo "  -p save preferences in the file"
     echo "  -W web files only"
     echo "  -A apache_conf                  - def. $apache_conf"
+    echo "  -c number cards in hand         - def. $card_hand"
     echo "  -n number of players            - def. $players_n"
     echo "  -t number of tables             - def. $tables_n"
     echo "  -T number of auth-only tables   - def. $tables_auth_n"
@@ -135,6 +137,7 @@ while [ $# -gt 0 ]; do
         -A*) apache_conf="$(get_param "-A" "$1" "$2")"; sh=$?;;
         -f*) conffile="$(get_param "-f" "$1" "$2")"; sh=$?;;
         -p*) outconf="$(get_param "-p" "$1" "$2")"; sh=$?;;
+        -c*) card_hand="$(get_param "-c" "$1" "$2")"; sh=$?;;
         -n*) players_n="$(get_param "-n" "$1" "$2")"; sh=$?;;
         -t*) tables_n="$(get_param "-t" "$1" "$2")"; sh=$?;;
         -T*) tables_auth_n="$(get_param "-T" "$1" "$2")"; sh=$?;;
@@ -168,8 +171,9 @@ done
 #
 echo "    outconf:    \"$outconf\""
 echo "    apache_conf:\"$apache_conf\""
+echo "    card_hand:   $card_hand"
 echo "    players_n:   $players_n"
-echo "    tables_n:   $tables_n"
+echo "    tables_n:    $tables_n"
 echo "    tables_auth_n: $tables_auth_n"
 echo "    brisk_auth_conf: \"$brisk_auth_conf\""
 echo "    brisk_debug:\"$brisk_debug\""
@@ -189,6 +193,7 @@ if [ ! -z "$outconf" ]; then
     echo "#  Produced automatically by brisk::INSTALL.sh"
     echo "#"
     echo "apache_conf=$apache_conf"
+    echo "card_hand=$card_hand"
     echo "players_n=$players_n"
     echo "tables_n=$tables_n"
     echo "tables_auth_n=$tables_auth_n"
@@ -249,6 +254,11 @@ IFS='
 #
 ftokk_path="${ftok_path}k"
 
+if [ $card_hand -lt 3 -o $card_hand -gt 8 ]; then
+    echo "card_hand ($card_hand) out of range (3 <= c <= 8)"
+    exit 1
+fi
+
 if [ $players_n -ne 3 -a $players_n -ne 5 ]; then
     echo "players_n ($players_n) out of range (3|5)"
     exit 1
@@ -332,6 +342,7 @@ else
 fi
 
 # .js substitutions
+sed -i "s/CARD_HAND *= *[0-9]\+/CARD_HAND = $card_hand/g" $(find ${web_path}__ -type f -name '*.js' -exec grep -l 'CARD_HAND *= *[0-9]\+' {} \;)
 sed -i "s/PLAYERS_N *= *[0-9]\+/PLAYERS_N = $players_n/g" $(find ${web_path}__ -type f -name '*.js' -exec grep -l 'PLAYERS_N *= *[0-9]\+' {} \;)
 
 sed -i "s/^var G_send_time *= *[0-9]\+/var G_send_time = $send_time/g" $(find ${web_path}__ -type f -name '*.js' -exec grep -l '^var G_send_time *= *[0-9]\+' {} \;)
@@ -339,6 +350,8 @@ sed -i "s/^var G_send_time *= *[0-9]\+/var G_send_time = $send_time/g" $(find ${
 # .ph[pho] substitutions
 sed -i "s/define *( *'PLAYERS_N', *[0-9]\+ *)/define('PLAYERS_N', $players_n)/g" $(find ${web_path}__ -type f -name '*.ph*' -exec grep -l "define *( *'PLAYERS_N', *[0-9]\+ *)" {} \;)
 
+sed -i "s/define *( *'BIN5_CARD_HAND', *[0-9]\+ *)/define('BIN5_CARD_HAND', $card_hand)/g" $(find ${web_path}__ -type f -name '*.ph*' -exec grep -l "define *( *'BIN5_CARD_HAND', *[0-9]\+ *)" {} \;)
+
 sed -i "s/define *( *'BIN5_PLAYERS_N', *[0-9]\+ *)/define('BIN5_PLAYERS_N', $players_n)/g" $(find ${web_path}__ -type f -name '*.ph*' -exec grep -l "define *( *'BIN5_PLAYERS_N', *[0-9]\+ *)" {} \;)
 
 sed -i "s@define *( *'FTOK_PATH',[^)]*)@define('FTOK_PATH', \"$ftok_path\")@g" $(find ${web_path}__ -type f -name '*.ph*' -exec grep -l "define *( *'FTOK_PATH',[^)]*)" {} \;)
index fd9ece4..56908c4 100644 (file)
--- a/TODO.txt
+++ b/TODO.txt
@@ -3,6 +3,23 @@
 
   FEATURES |
  ----------+
+   WIP - CONTINUE FEATURE
+     . replace explicit strings with multilanguage array
+
+     DONE . save points every game
+     DONE . modify points calculation to include order and mazzo
+     DONE . exclude not standard types from statistics
+         DONE . daily reports (1 for each active tournament)
+         DONE . monthly stats (for normal match only)
+
+     DONE . show current match ID when created
+     DONE . add info about continue to the info page
+     DONE . add command to continue
+       DONE . check consistency of the request
+     DONE . rearrange users and game status to continue the selected match
+
+     DONE . investigate user reordering ??
+
    - WEBSOCKET TRANSPORT
      . refactoring $enc attribute management
      DONE . reintroduced $enc = 'plain' for websocket
diff --git a/bin/3fire.sh b/bin/3fire.sh
new file mode 100755 (executable)
index 0000000..f2ba79d
--- /dev/null
@@ -0,0 +1,80 @@
+#!/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"
+
+
+# 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) ' | 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) ' | 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]})$")"
+        l="$(echo "$wids" | wc -l)"
+        if [ $l -eq 3 ]; then
+            for i in $(seq 0 2); 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; 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; do
+        firefox -no-remote -P $i "$HOMEPAGE?whoami=$i" &
+        pd="$!"
+        echo "$i: $pd"
+        pids[$ct]="$pd"
+        ct=$((ct + 1))
+    done
+
+    rearrange_windows
+fi
index b272a98..a0b93e0 100755 (executable)
@@ -1,2 +1,3 @@
 #!/bin/bash
-etags -l php $(find -name '*.ph*')
\ No newline at end of file
+etags -l php $(find -name '*.ph*')
+
index 45d7c24..d074067 100644 (file)
@@ -1,5 +1,25 @@
 Sparse documentation about Brisk.
 
+==== brisk/table/user relationships ====
+
+=== in the room ===
+
+// when standup
+bri->user[user_idx] = user
+user->idx      = user_idx
+user->idx_orig = user_idx
+
+// when sitdown
+table->player[player_idx] = user_idx
+user->table_pos = player_idx
+
+=== in the game ===
+
+bin5->user[user_idx] = user
+table->player[player_idx] = user_idx
+user->table_pos = player_idx
+
+
 Many things aren't documented at all, but I start with authentication workflow.
 
 ==== MODIFY USERS TABLE ====
@@ -45,3 +65,10 @@ index.php:
     - align many status var with briskin5 user values
     - room_join_wakeup()
 
+==== Chunk flow ====
+
+
+$ret = $user->maincheck($old_stat, $old_subst, $old_step, $this->rd_stat, $this->rd_subst, $this->rd_step,
+                        $splashdate, $table_idx, $table_token))
+$user->rd_transp->chunk($this->rd_scristp++, $ret);
+
index 2a02633..83843d3 100755 (executable)
@@ -1,8 +1,83 @@
 #! /bin/bash
 
 #
-#  all this part is from mopshop and we will use it to construct the brisk database
+#  functions
+usage () {
+    echo " USAGE"
+    echo "   ./builder <command> [-d|--dryrun] [-a|--allfiles] [-s|--short] ..."
+    echo "   ./builder <-h|--help|help>"
+    echo "   commands are:"
+    echo "       create"
+    echo "       destroy"
+    echo "       clean"
+    echo "       build"
+    echo "       rebuild"
+    echo "       psql"
+    echo "       piped"
+    echo "       add <filesql> [<filesql2> [..]]"
+    echo "       del <filesql> [<filesql2> [..]]"
+    echo "       dump [dumpfile]"
+    echo "       dumpall [dumpfile]"
+    echo "       all"
+    exit $1
+}
+
+sqlexe () {
+    local sht
+    sht=$1
+
+    if [ "$SHORT" = "y" ];  then
+        sed "s/#PFX#/$PFX/g" | psql -a $pg_args 2>&1 | egrep 'ERROR|^-- MESG'
+    else
+        sed "s/#PFX#/$PFX/g" | psql -a $pg_args
+    fi
+
+    return 0
+}
+
+one_or_all() {
+    if [ "$ALL_FILES" = "y" ]; then
+        sfx_files='*'
+    else
+        sfx_files='*.sql'
+    fi
+
+    if [ "$1" = "" ]; then
+        cat sql.d/$sfx_files
+    else
+        cat "$1"
+    fi
+}
+
 #
+#  MAIN
+#
+
+CMD=$1
+shift
+
+while [ $# -gt 0 ]; do
+    case $1 in
+        -d|--dryrun)
+            DRY_RUN=y
+            psql () {
+                echo "MOCKPSQL params: $@"
+                cat
+            }
+            ;;
+        -a|--allfiles)
+            ALL_FILES=y
+            ;;
+        -s|--short)
+            SHORT=y
+            ;;
+        *)
+            break
+            ;;
+    esac
+    shift
+done
+
 if [ -f $HOME/.brisk-db.conf ]; then
     source $HOME/.brisk-db.conf
 elif [ -f $HOME/.db.conf ]; then
@@ -25,84 +100,63 @@ test "$DBHOST" != "" && pg_args="$pg_args -h $DBHOST"
 test "$DBUSER" != "" && pg_args="$pg_args -U $DBUSER"
 test "$DBPORT" != "" && pg_args="$pg_args -p $DBPORT"
 test "$DBBASE" != "" && pg_args="$pg_args $DBBASE"
-       
-sqlexe () {
-    local sht
-    sht=$1
-    
-    if [ $sht -eq 1 ];  then 
-        sed "s/#PFX#/$PFX/g" | psql -a $pg_args 2>&1 | egrep 'ERROR|^-- MESG' 
-    else
-        sed "s/#PFX#/$PFX/g" | psql -a $pg_args
-    fi
 
-    return 0
-}
+MATCH_DROP='^drop|^alter table.* drop '
 
-one_or_all() {
-    if [ "$1" = "" ]; then
-        cat sql.d/*.sql
-    else
-        cat "$1"
-    fi
-}
+case $CMD in
+    "create")
+        echo "su root"
+        su root -c "su postgres -c \"echo \\\"DBUser passwd: $DBPASS\\\" ; createuser -S -D -R -P $DBUSER && createdb -E utf8 -O $DBUSER $DBBASE\""
+        ;;
 
-#
-# MAIN
-#
-sht=0
+    "destroy")
+        echo "su root"
+        su root -c "su postgres -c \"dropdb $DBBASE && dropuser $DBUSER\""
+        ;;
+    "clean")
+        ( echo "-- MESG: clean start" ; one_or_all $2 | egrep -i "$MATCH_DROP" | tac ; echo "-- MESG: clean end" ;   ) | sqlexe
+        ;;
+    "build")
+        ( echo "-- MESG: build start" ; one_or_all $2 | egrep -iv "$MATCH_DROP" ; echo "-- MESG: build end" ;   ) | sqlexe
+        ;;
+    "rebuild")
+        ( echo "-- MESG: clean start" ; one_or_all $2 | egrep -i "$MATCH_DROP" | tac ; echo "-- MESG: clean end" ; \
+            echo "-- MESG: build start" ; one_or_all $2 | egrep -iv "$MATCH_DROP" ; echo "-- MESG: build end" ;   ) \
+            | sqlexe
+        ;;
+    "psql")
+        psql $pg_args $@
+        ;;
 
-if [ "$1" = "-s" ]; then
-    shift
-    sht=1
-fi
+    "piped")
+        psql $pg_args -t -q -A -F '|' $@
+        ;;
+    "dump")
+        if [ $# -eq 1 ]; then
+            pg_dump -a --inserts -h $DBHOST -U $DBUSER $DBBASE
+        else
+            pg_dump -a --inserts -h $DBHOST -U $DBUSER $DBBASE > $1
+        fi
+        ;;
+    "dumpall")
+        if [ $# -eq 1 ]; then
+            pg_dump -h $DBHOST -U $DBUSER $DBBASE
+        else
+            pg_dump -h $DBHOST -U $DBUSER $DBBASE > $1
+        fi
+        ;;
+    "add")
+        ( echo "-- MESG: add start" ; cat "$@" | egrep -iv "$MATCH_DROP" ; echo "-- MESG: add end" ;   ) | sqlexe
+        ;;
+    "del")
+        ( echo "-- MESG: del start" ; cat "$@" | egrep -i  "$MATCH_DROP" | tac ; echo "-- MESG: del end" ;   ) | sqlexe
+        ;;
+    "help"|"-h"|"--help")
+        usage 0
+        ;;
+    *)
+        usage 1
+        ;;
+esac
 
-if [ "$1" = "create" ]; then
-    echo "su root" 
-    su root -c "su postgres -c \"echo \\\"DBUser passwd: $DBPASS\\\" ; createuser -S -D -R -P $DBUSER && createdb -E utf8 -O $DBUSER $DBBASE\"" 
-elif [ "$1" = "destroy" ]; then
-    echo "su root" 
-    su root -c "su postgres -c \"dropdb $DBBASE && dropuser $DBUSER\"" 
-elif [ "$1" = "clean" ]; then
-    ( echo "-- MESG: clean start" ; one_or_all $2 | grep -i '^drop' | tac ; echo "-- MESG: clean end" ;   ) | sqlexe $sht
-elif [ "$1" = "build" ]; then
-    ( echo "-- MESG: build start" ; one_or_all $2 | grep -iv '^drop' ; echo "-- MESG: build end" ;   ) | sqlexe $sht
-elif [ "$1" = "rebuild" ]; then
-    ( echo "-- MESG: clean start" ; one_or_all $2 | grep -i '^drop' | tac ; echo "-- MESG: clean end" ; \
-        echo "-- MESG: build start" ; one_or_all $2 | grep -iv '^drop' ; echo "-- MESG: build end" ;   ) \
-        | sqlexe $sht
-elif [ "$1" = "psql" ]; then
-   shift
-   psql $pg_args $@
-elif [ "$1" = "piped" ]; then
-   shift
-   psql $pg_args -t -q -A -F '|' $@
-elif [ "$1" = "dump" ]; then
-    if [ $# -eq 1 ]; then
-        pg_dump -a --inserts -h $DBHOST -U $DBUSER $DBBASE
-    else
-        pg_dump -a --inserts -h $DBHOST -U $DBUSER $DBBASE > $2
-    fi
-elif [ "$1" = "dumpall" ]; then
-    if [ $# -eq 1 ]; then
-        pg_dump -h $DBHOST -U $DBUSER $DBBASE
-    else
-        pg_dump -h $DBHOST -U $DBUSER $DBBASE > $2
-    fi
-elif [ "$1" = "add" ]; then
-    cat "$2" | sqlexe $sht
-else
-    echo " USAGE"
-    echo "   ./builder create"
-    echo "   ./builder destroy"
-    echo "   ./builder clean"
-    echo "   ./builder build"
-    echo "   ./builder rebuild"
-    echo "   ./builder psql"
-    echo "   ./builder piped"
-    echo "   ./builder add <filesql>"
-    echo "   ./builder dump [dumpfile]"
-    echo "   ./builder dumpall [dumpfile]"
-    echo "   ./builder all"
-    echo "   ./builder help"
-fi
+exit 0
index e5c6b44..727a391 100644 (file)
@@ -1,2 +1,6 @@
+ALTER TABLE #PFX#users DROP COLUMN last_dona;
 ALTER TABLE #PFX#users ADD COLUMN last_dona integer DEFAULT 0;             -- last donate
-ALTER TABLE #PFX#users ADD COLUMN supp_comp text    DEFAULT 'ff0000ffff00' -- fg/bg supporter color
\ No newline at end of file
+
+ALTER TABLE #PFX#users DROP COLUMN supp_comp;
+ALTER TABLE #PFX#users ADD COLUMN supp_comp text    DEFAULT 'ff0000ffff00'; -- fg/bg supporter color
+
diff --git a/sql/sql.d/054-continue-match.sql b/sql/sql.d/054-continue-match.sql
new file mode 100644 (file)
index 0000000..0ed40fb
--- /dev/null
@@ -0,0 +1,31 @@
+DROP TABLE #PFX#bin5_table_orders;
+CREATE TABLE #PFX#bin5_table_orders (
+       mcode  integer REFERENCES #PFX#bin5_matches (code) ON DELETE cascade ON UPDATE cascade,
+       pos    integer,
+       ucode  integer REFERENCES #PFX#users (code) ON DELETE cascade ON UPDATE cascade
+       );
+
+ALTER TABLE #PFX#bin5_matches DROP COLUMN mult_next;
+ALTER TABLE #PFX#bin5_matches ADD COLUMN mult_next  integer DEFAULT -1;  -- next multiplier
+
+ALTER TABLE #PFX#bin5_matches DROP COLUMN mazzo_next;
+ALTER TABLE #PFX#bin5_matches ADD COLUMN mazzo_next integer DEFAULT -1;  -- next card shaker
+
+       
+ALTER TABLE #PFX#bin5_games DROP COLUMN asta_pnt;
+ALTER TABLE #PFX#bin5_games ADD COLUMN asta_pnt     integer DEFAULT -1;  -- curr bet points
+
+ALTER TABLE #PFX#bin5_games DROP COLUMN pnt;
+ALTER TABLE #PFX#bin5_games ADD COLUMN pnt          integer DEFAULT -1;  -- curr points made
+
+ALTER TABLE #PFX#bin5_games DROP COLUMN asta_win;
+ALTER TABLE #PFX#bin5_games ADD COLUMN asta_win     integer DEFAULT -1;  -- curr caller id
+
+ALTER TABLE #PFX#bin5_games DROP COLUMN friend;
+ALTER TABLE #PFX#bin5_games ADD COLUMN friend       integer DEFAULT -1;  -- curr callee id
+
+ALTER TABLE #PFX#bin5_games DROP COLUMN mazzo;
+ALTER TABLE #PFX#bin5_games ADD COLUMN mazzo        integer DEFAULT -1;  -- curr card shaker
+
+ALTER TABLE #PFX#bin5_games DROP COLUMN mult;
+ALTER TABLE #PFX#bin5_games ADD COLUMN mult         integer DEFAULT -1;  -- curr multiplier
diff --git a/sql/sql.d/060-tournament.sql b/sql/sql.d/060-tournament.sql
new file mode 100644 (file)
index 0000000..7f9e340
--- /dev/null
@@ -0,0 +1,20 @@
+DROP TABLE #PFX#bin5_tournaments;
+CREATE TABLE #PFX#bin5_tournaments (
+       code   SERIAL PRIMARY KEY,
+       active integer,
+       name   text
+       );
+
+-- add tournaments and field in the bin5_matches table
+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');
+ALTER SEQUENCE #PFX#bin5_tournaments_code_seq RESTART WITH 3;
+
+ALTER TABLE #PFX#bin5_matches DROP COLUMN tcode;
+ALTER TABLE #PFX#bin5_matches ADD COLUMN tcode integer DEFAULT 1;
+
+ALTER TABLE #PFX#bin5_matches DROP CONSTRAINT #PFX#bin5_matches_tcode_fkey;
+ALTER TABLE #PFX#bin5_matches ADD FOREIGN KEY (tcode) REFERENCES #PFX#bin5_tournaments(code) ON UPDATE cascade ON DELETE cascade;
+
+ALTER TABLE #PFX#bin5_games DROP COLUMN act;
+ALTER TABLE #PFX#bin5_games ADD COLUMN act integer DEFAULT -1;  -- end reason of the game
index d902048..474c39b 100644 (file)
 -- define(USER_FLAG_TY_SUSPEND, 0x00400000); // done
 -- define(USER_FLAG_TY_DISABLE, 0x00800000); // done
 
-INSERT INTO #PFX#users (code, login, pass, email, type, flags) VALUES (1, 'uno', md5('one'), 'uno@pluto.com', CAST (X'00020000' as integer), 0);
-INSERT INTO #PFX#users (code, login, pass, email, type, flags) VALUES (2, 'due', md5('two'), 'due@pluto.com', CAST (X'00010000' as integer), 0);
-INSERT INTO #PFX#users (code, login, pass, email, type, flags) VALUES (3, 'tre', md5('thr'), 'tre@pluto.com', CAST (X'00010000' as integer), 0);
-INSERT INTO #PFX#users (code, login, pass, email, type, flags) VALUES (4, 'qua', md5('for'), 'qua@pluto.com', CAST (X'00210000' as integer), 0);
-INSERT INTO #PFX#users (code, login, pass, email, type, flags) VALUES (5, 'cin', md5('fiv'), 'cin@pluto.com', CAST (X'00010000' as integer), 0);
-
+INSERT INTO #PFX#users (code, login, pass, email, type) VALUES (10101, 'uno', md5('one'), 'uno@pluto.com', CAST (X'00020000' as integer));
+INSERT INTO #PFX#users (code, login, pass, email, type) VALUES (10102, 'due', md5('two'), 'due@pluto.com', CAST (X'00010000' as integer));
+INSERT INTO #PFX#users (code, login, pass, email, type) VALUES (10103, 'tre', md5('thr'), 'tre@pluto.com', CAST (X'00010000' as integer));
+INSERT INTO #PFX#users (code, login, pass, email, type) VALUES (10104, 'qua', md5('for'), 'qua@pluto.com', CAST (X'00010000' as integer));
+INSERT INTO #PFX#users (code, login, pass, email, type) VALUES (10105, 'cin', md5('fiv'), 'cin@pluto.com', CAST (X'00010000' as integer));
+INSERT INTO #PFX#users (code, login, pass, email, type) VALUES (10106, 'sei', md5('six'), 'sei@pluto.com', CAST (X'00210000' as integer));
+ALTER SEQUENCE #PFX#users_code_seq RESTART WITH 10107;
index abcf468..56e7556 100644 (file)
@@ -141,12 +141,12 @@ $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 = "4.9.3";
+$G_brisk_version = "4.10.0";
 
 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
-$root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: aggiunto WebSocket come sistema preferenziale di comunicazione e corretto qualche bug.',
+$root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: aggiunto il comando /cont per proseguire le partite.',
                                        'Se vuoi iscriverti alla <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ),
-                       'en' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NEWS</b>: added WebSocket as preferential communication system and fixed some bug.',
+                       'en' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NEWS</b>: added /cont command to continue matches.',
                                        'If you want to subscribe our <a target="_blank" href="ml-briscola+subscribe@milug.org">Mailing List</a>, click it!' ) );
 
 $G_room_help = array( 'it' => '
@@ -173,6 +173,7 @@ Dopo che &egrave; iniziata una partita per uscirne dovete chiedere agli altri gi
 <dd><b>/nick <i>&lt;nuovo_nickname&gt;</i></b> - cambio di nickname
 <dd><b>/tav <i>&lt;frase di invito&gt;</i></b> - invito per gli altri giocatori al tavolo dove si &egrave; seduti 
 <dd><b>/st <i>&lt;stato&gt;</i></b> - cambia l\'icona associata al tuo user; <i>stato</i> pu&ograve; valere: \\"normale\\", \\"fuori\\", \\"pausa\\", \\"cibo\\", \\"cane\\", \\"lavoro\\", \\"presente\\" oppure \\"sigaretta\\"
+<dd><b>/cont <i>&lt;id partita&gt;</i></b> - quando si Ã¨ a un tavolo per garantiti, permette di proseguire una partita giocata in precedenza con gli stessi giocatori
 <dd><b>/authreq</b> - se si &egrave; autenticati permette di garantire per un utente fidato
 <dd><b>/mesgtoadm</b> - se si &egrave; autenticati permette di lasciare un messaggio all\'amministratore del sito
 <dd><b>/listen &lt;all or auth&gt;</b> - se si &egrave; autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
index 223b3a1..d917a81 100644 (file)
@@ -178,7 +178,7 @@ class BriskDB {
         return ($ret);
     }
 
-    function bin5_points_save($date, $ttok, $tidx, $codes, $pts)
+    function bin5_points_save($date, $table, $tidx, $action, $ucodes, $pts)
     {
         return TRUE;
     }
index 20f4725..ba8fc60 100644 (file)
@@ -3,7 +3,7 @@
    *  brisk - dbase_pgsql.phh
    *
    *  Copyright (C) 2006-2012 Matteo Nastasi
-   *                          mailto: nastasi@alternativeoutput.it 
+   *                          mailto: nastasi@alternativeoutput.it
    *                                  matteo.nastasi@milug.org
    *                          web: http://www.alternativeoutput.it
    *
@@ -34,20 +34,20 @@ function escsql($s)
     return str_replace($escsql_from, $escsql_to, $s);
 }
 
-class DBConn 
+class DBConn
 {
     static $dbcnnx = FALSE;
     var $db = FALSE;
-    
+
     function DBConn()
     {
-        $this->db = DBConn::$dbcnnx;        
+        $this->db = DBConn::$dbcnnx;
     }
 
     static function create()
     {
         GLOBAL $G_dbauth;
-        
+
         if (DBConn::$dbcnnx == FALSE) {
             if (!(DBConn::$dbcnnx = @pg_connect ($G_dbauth, PGSQL_CONNECT_FORCE_NEW))) {
                 return (FALSE);
@@ -85,7 +85,7 @@ class BriskDB
     var $dbconn;
     var $item;
     var $item_n;
-    
+
     function BriskDB($dbconn)
     {
         $this->dbconn = $dbconn;
@@ -98,15 +98,15 @@ class BriskDB
         $ret = FALSE;
 
         log_main("BriskDB create:start");
-        
+
         do {
             if (($dbconn = DBConn::create()) == FALSE) {
                 break;
             }
-            
+
             $ret = new BriskDB($dbconn);
         } while (0);
-        
+
         return ($ret);
     }
 
@@ -125,20 +125,20 @@ class BriskDB
     function users_load()
     {
     }
-    
+
     function login_exists($login)
     {
         GLOBAL $G_dbpfx;
 
         /* check the existence of the nick in the BriskDB */
         log_main("login_exists: ".$login);
-        
+
         $user_sql = sprintf("SELECT * FROM %susers WHERE login = lower('%s') AND (type & CAST (X'%08x' as integer)) = 0;",
                             $G_dbpfx, escsql($login), USER_FLAG_TY_DISABLE);
         if (($user_pg = $this->query($user_sql)) != FALSE)
             if (pg_numrows($user_pg) == 1)
                 return TRUE;
-        
+
         return FALSE;
     }
 
@@ -151,7 +151,7 @@ class BriskDB
         }
         if (pg_numrows($user_pg) != 1)
             return FALSE;
-        
+
         $user_obj = pg_fetch_object($user_pg, 0);
 
         return ($user_obj);
@@ -187,37 +187,39 @@ class BriskDB
 
         return TRUE;
     }
-    
+
+    /*
+      if success return a LoginDBItem object
+     */
     function login_verify($login, $pass)
     {
         GLOBAL $G_dbpfx;
-        
+
         $ret = FALSE;
-        
+
         log_main("login_verify: ".$login);
-        
-        
+
         //O /* check the existence of the nick in the BriskDB */
         //O for ($i = 0 ; $i < $this->item_n ; $i++) {
         //O log_main("login_verify: BEGIN");
-        
+
         if (($user_obj = $this->getrecord_bylogin($login)) == FALSE) {
             return FALSE;
         }
 
         log_main("login[".$user_obj->code."]: ".$user_obj->login);
-        
+
         /* if it exists check for a valid challenge */
-        if (($a_sem = Challenges::lock_data(TRUE)) != FALSE) { 
+        if (($a_sem = Challenges::lock_data(TRUE)) != FALSE) {
             if (($chals = &Challenges::load_data()) != FALSE) {
                 for ($e = 0 ; $e < $chals->item_n ; $e++) {
                     log_main("challenge[".$e."]: ".$chals->item[$e]->login);
                     if (strcmp($login, $chals->item[$e]->login) == 0) {
                         log_main("login_verify [".$pass."] with [".md5($chals->item[$e]->token.$user_obj->pass)."]");
-                        
+
                         if (strcmp($pass, md5($chals->item[$e]->token.$user_obj->pass)) == 0) {
                             log_main("login_verify SUCCESS for ".$login);
-                            
+
                             $chals->rem($login);
                             $this->user_update_login_time($user_obj->code, time());
                             $ret = LoginDBItem::LoginDBItemFromRecord($user_obj);
@@ -226,33 +228,33 @@ class BriskDB
                     }
                 } // end for ($e = 0 ...
             }
-            
+
             if ($chals->ismod()) {
                 Challenges::save_data(&$chals);
             }
-            
+
             Challenges::unlock_data($a_sem);
         }
         //O break;
         // O } //  if (strcasecmp($this->item[$i]->login, ...
         //O }
-    
+
         return ($ret);
     }
 
     function getitem_bylogin($login, &$id) {
         $ret = FALSE;
         $id = -1;
-        
+
         log_main("getitem_bylogin: ".$login);
-        
+
         if (($user_obj = $this->getrecord_bylogin($login)) == FALSE)
             return $ret;
 
         $id = $user_obj->code;
         return (LoginDBItem::LoginDBItemFromRecord($user_obj));
     }
-    
+
     // TODO FOR DB
     function getmail($login)
     {
@@ -260,7 +262,7 @@ class BriskDB
 
         if (($ret = $this->getrecord_bylogin($login)) == FALSE)
             return FALSE;
-        
+
         return ($ret->email);
     }
 
@@ -271,7 +273,7 @@ class BriskDB
         for ($i = 0 ; $i < $olddb->count() ; $i++) {
             $user_sql = sprintf("INSERT INTO %susers ( login, pass, email, type) VALUES ('%s', '%s', '%s', %d);",
                                 $G_dbpfx, escsql(strtolower($olddb->item[$i]->login)), escsql($olddb->item[$i]->pass),
-                                escsql($olddb->item[$i]->email), $olddb->item[$i]->type & USER_FLAG_TY_ALL); 
+                                escsql($olddb->item[$i]->email), $olddb->item[$i]->type & USER_FLAG_TY_ALL);
 
             if ( ! (($user_pg  = $this->query($user_sql)) != FALSE && pg_affected_rows($user_pg) == 1) ) {
                 $cont .= sprintf("ERROR IN LINE: %s\n", eschtml($user_sql));
@@ -287,11 +289,181 @@ class BriskDB
         return ($this->dbconn);
     }
 
-    //   ttok   text UNIQUE,      
-    //   tidx   
-    function bin5_points_save($date, $ttok, $tidx, $ucodes, $pts)
+    // return array of array('code', 'login' [, 'first', 'last', 'tidx']) ordered by table position
+    function users_get($match_code, $with_minmaxtidx, $is_newmatch)
+    {
+        GLOBAL $G_dbpfx;
+
+        if ($is_newmatch) { // is new
+            $usr_sql = sprintf("SELECT u.code AS code, u.login AS login%s
+                                  FROM %sbin5_matches AS m, %sbin5_games AS g, %sbin5_points AS p,
+                                       %susers AS u, %sbin5_table_orders AS o
+                                  WHERE m.code = g.mcode AND g.code = p.gcode AND u.code = p.ucode
+                                       AND m.code = o.mcode AND u.code = o.ucode AND m.code = %d
+                                  GROUP BY u.code, u.login%s, o.pos
+                                  ORDER BY o.pos;",
+                               ($with_minmaxtidx ? ", min(g.tstamp) AS first, max(g.tstamp) AS last, m.tidx AS tidx" : ""),
+                               $G_dbpfx, $G_dbpfx, $G_dbpfx, $G_dbpfx, $G_dbpfx, $match_code,
+                               ($with_minmaxtidx ? ", m.tidx" : ""));
+        }
+        else { // is old
+            $usr_sql = sprintf("SELECT u.code AS code, u.login AS login%s
+                                  FROM %sbin5_matches AS m, %sbin5_games AS g, %sbin5_points AS p, %susers AS u
+                                  WHERE m.code = g.mcode AND g.code = p.gcode AND u.code = p.ucode AND m.code = %d
+                                  GROUP BY u.code, u.login%s;",
+                               ($with_minmaxtidx ? ", min(g.tstamp) AS first, max(g.tstamp) AS last, m.tidx AS tidx" : ""),
+                               $G_dbpfx, $G_dbpfx, $G_dbpfx, $G_dbpfx, $match_code,
+                               ($with_minmaxtidx ? ", m.tidx" : ""));
+        }
+
+        if (($usr_pg  = pg_query($this->dbconn->db(), $usr_sql)) == FALSE ) {
+            log_crit(sprintf("%s::%s: pg_query usr_sql failed [%s]", __CLASS__, __FUNCTION__, $usr_sql));
+            return (FALSE);
+        }
+        $usr_n = pg_numrows($usr_pg);
+        if ($usr_n != BIN5_PLAYERS_N) {
+            log_crit(sprintf("%s::%s: wrong number of players [%s] %d", __CLASS__, __FUNCTION__, $usr_sql, $usr_n));
+            return (FALSE);
+        }
+        $users = array();
+
+        if ($with_minmaxtidx)
+            $fields = array('code', 'login', 'first', 'last', 'tidx');
+        else
+            $fields = array('code', 'login');
+
+        for ($u = 0 ; $u < $usr_n ; $u++) {
+            $usr_obj = pg_fetch_object($usr_pg, $u);
+            $users[$u] = array();
+            foreach($fields as $field) {
+                $users[$u][$field] = $usr_obj->$field;
+            }
+        }
+        return ($users);
+    }
+
+    // out: tab->{points,points_n,old_reason}, in: tab->ttok
+    function match_continue($match_code, $table, $tidx)
+    {
+        GLOBAL $G_dbpfx;
+
+        if (($users = $this->users_get($match_code, FALSE /*without minmaxidx*/, TRUE /*new game*/)) == FALSE) {
+            log_crit(sprintf("%s::%s: retrieve users fails", __CLASS__, __FUNCTION__));
+            return (FALSE);
+        }
+
+        $num_sql = sprintf("SELECT count(*) AS points_n FROM %sbin5_games WHERE mcode = %d;", $G_dbpfx, $match_code);
+        if (($num_pg  = $this->query($num_sql)) == FALSE || pg_numrows($num_pg) != 1) {
+            log_crit(sprintf("%s::%s: get games number fails", __CLASS__, __FUNCTION__));
+            return (FALSE);
+        }
+        $num_obj = pg_fetch_object($num_pg, 0);
+        $table->points_n = $num_obj->points_n;
+
+        $tot_sql = sprintf("SELECT sum(p.pts) AS pts
+                            FROM %sbin5_games AS g, %sbin5_points AS p, %susers AS u,
+                                 %sbin5_table_orders AS o
+                            WHERE g.mcode = %d AND g.code = p.gcode AND p.ucode = u.code
+                                  AND p.ucode = o.ucode AND g.mcode = o.mcode
+                            GROUP BY p.ucode, o.pos
+                            ORDER BY o.pos;",
+                           $G_dbpfx, $G_dbpfx, $G_dbpfx, $G_dbpfx, $match_code);
+        if (($tot_pg  = pg_query($this->dbconn->db(), $tot_sql)) == FALSE
+            || pg_numrows($tot_pg) != BIN5_PLAYERS_N) {
+            log_crit(sprintf("%s::%s: get games totals fails", __CLASS__, __FUNCTION__));
+            return(FALSE);
+        }
+
+        $u = 0;
+        foreach ($users as $user) {
+            $pts_sql = sprintf("SELECT p.pts AS pts
+                                    FROM %sbin5_points as p, %sbin5_games as g
+                                    WHERE p.gcode = g.code AND g.mcode = %d AND p.ucode = %d
+                                    ORDER BY g.code ASC
+                                    LIMIT %d OFFSET %d;",
+                               $G_dbpfx, $G_dbpfx, $match_code, $user['code'],
+                               MAX_POINTS,
+                               ($num_obj->points_n < MAX_POINTS ? 0 : $num_obj->points_n - MAX_POINTS));
+
+            // points of the match for each user
+            if (($pts_pg  = $this->query($pts_sql)) == FALSE) {
+                log_crit(sprintf("%s::%s: get points fails", __CLASS__, __FUNCTION__));
+                return (FALSE);
+            }
+            $pts_n = pg_numrows($pts_pg);
+            if ($pts_n > $table->points_n) {
+                // inconsistent scenario number of points great than number of games
+                log_crit(sprintf("%s::%s: number of points great than number of games", __CLASS__, __FUNCTION__));
+                return (FALSE);
+            }
+            for ($i = 0 , $ct = $table->points_n - $pts_n; $ct < $table->points_n ; $ct++, $i++) {
+                $pts_obj = pg_fetch_object($pts_pg, $i);
+                $table->points[$ct % MAX_POINTS][$u] = $pts_obj->pts;
+            }
+            $tot_obj = pg_fetch_object($tot_pg, $u);
+            $table->total[$u] = $tot_obj->pts;
+
+            $u++;
+        }
+
+        $gam_sql = sprintf("SELECT * FROM %sbin5_games WHERE mcode = %d ORDER BY code DESC LIMIT 1;", $G_dbpfx, $match_code);
+        if (($gam_pg  = $this->query($gam_sql)) == FALSE || pg_numrows($gam_pg) != 1) {
+            log_crit(sprintf("%s::%s: get last game fails", __CLASS__, __FUNCTION__));
+            return (FALSE);
+        }
+        $gam_obj = pg_fetch_object($gam_pg, 0);
+
+        $table->old_reason = game_description($gam_obj->act, 'html', $gam_obj->mult,
+                                              $gam_obj->asta_win, $users[$gam_obj->asta_win]['login'],
+                                              $gam_obj->friend, $users[$gam_obj->friend]['login'],
+                                              $gam_obj->pnt, $gam_obj->asta_pnt);
+
+        return (TRUE);
+    }
+
+    function match_order_get(&$match_data, $match_code, $exp_num)
+    {
+        GLOBAL $G_dbpfx;
+
+        $ord_sql = sprintf("SELECT ucode FROM %sbin5_table_orders WHERE mcode = %d ORDER BY pos ASC;",
+                           $G_dbpfx, $match_code);
+
+        if (($ord_pg  = $this->query($ord_sql)) == FALSE || pg_numrows($ord_pg) != $exp_num) {
+            log_crit(sprintf("%s: fails for id or users number", __FUNCTION__));
+            return (FALSE);
+        }
+
+        $ucodes = array();
+        for ($i = 0 ; $i < $exp_num ; $i++) {
+            $ord_obj = pg_fetch_object($ord_pg, $i);
+            $ucodes[$i] = $ord_obj->ucode;
+        }
+
+        if ($match_data !== NULL) {
+            $mtdt_sql = sprintf("SELECT * FROM %sbin5_matches WHERE code = %d;",
+                                $G_dbpfx, $match_code);
+
+            if (($mtdt_pg  = $this->query($mtdt_sql)) == FALSE || pg_numrows($mtdt_pg) != 1) {
+                log_crit(sprintf("%s: fails retrieve match_data values [%d]", __FUNCTION__, $match_code));
+                return (FALSE);
+            }
+
+            $mtdt_obj = pg_fetch_object($mtdt_pg, 0);
+
+            foreach (array('ttok', 'tidx', 'mult_next', 'mazzo_next', 'tcode') as $match_name) {
+                $match_data[$match_name] = $mtdt_obj->$match_name;
+            }
+        }
+
+        return ($ucodes);
+    }
+
+    //   ttok   text UNIQUE,
+    //   tidx
+    function bin5_points_save($date, $table, $tidx, $action, $ucodes, $pts)
     {
         GLOBAL $G_dbpfx;
+        $sql_ttok = escsql($table->table_token);
 
         $is_trans = FALSE;
         $ret = FALSE;
@@ -299,7 +471,7 @@ class BriskDB
         $n = count($ucodes);
         /* check the existence of the nick in the BriskDB */
         log_main("bin5_points_save: ");
-        
+
         do {
             if ($this->query("BEGIN") == FALSE) {
                 break;
@@ -309,31 +481,49 @@ class BriskDB
             /*
              * matches management
              */
-            $mtc_sql = sprintf("SELECT * FROM %sbin5_matches WHERE ttok = '%s';", $G_dbpfx, escsql($ttok));
+            $mtc_sql = sprintf("UPDATE %sbin5_matches SET (mazzo_next, mult_next) = (%d, %d) WHERE ttok = '%s' RETURNING *;",
+                               $G_dbpfx, $table->mazzo, $table->mult, $sql_ttok);
             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) VALUES ('%s', %d) RETURNING *;",
-                                   $G_dbpfx, escsql($ttok), $tidx);
-                if ( ! (($mtc_pg  = $this->query($mtc_sql)) != FALSE &&
-                        pg_affected_rows($mtc_pg) == 1) ) {
+                $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);
+                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;
                 }
+                $mtc_obj = pg_fetch_object($mtc_pg, 0);
+
+                for ($i = 0 ; $i < $n ; $i++) {
+                    $ord_sql = sprintf("INSERT INTO %sbin5_table_orders (mcode, ucode, pos) VALUES (%d, %d, %d);",
+                                       $G_dbpfx, $mtc_obj->code, $ucodes[$i], $i);
+                    if (($ord_pg = $this->query($ord_sql)) == FALSE || pg_affected_rows($ord_pg) != 1 ) {
+                        log_crit(sprintf("bin5_points_save: failed at insert table order [%s]", $ord_sql));
+                        break;
+                    }
+                }
+                if ($i < $n)
+                    break;
+            }
+            else {
+                $mtc_obj = pg_fetch_object($mtc_pg,0);
             }
-            $mtc_obj = pg_fetch_object($mtc_pg,0);
 
             /*
              * games management
              */
-            $gam_sql = sprintf("INSERT INTO %sbin5_games (mcode, tstamp) 
-                                               VALUES (%d, to_timestamp(%d)) RETURNING *;",
-                               $G_dbpfx, $mtc_obj->code, $date);
-            if ( ! (($gam_pg  = $this->query($gam_sql)) != FALSE &&
-                    pg_affected_rows($gam_pg) == 1) ) {
+            $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 *;",
+                               $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);
+            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;                        
+                break;
             }
-        
+
             $gam_obj = pg_fetch_object($gam_pg,0);
 
             /*
@@ -341,37 +531,36 @@ class BriskDB
              */
             for ($i = 0 ; $i < $n ; $i++) {
                 /* put points */
-                $pts_sql = sprintf("INSERT INTO %sbin5_points (gcode, ucode, pts) 
+                $pts_sql = sprintf("INSERT INTO %sbin5_points (gcode, ucode, pts)
                                                VALUES (%d, %d, %d);",
                                    $G_dbpfx, $gam_obj->code, $ucodes[$i], $pts[$i]);
-                if ( ! (($pts_pg  = $this->query($pts_sql)) != FALSE &&
-                        pg_affected_rows($pts_pg) == 1) ) {
+                if (($pts_pg  = $this->query($pts_sql)) == FALSE || pg_affected_rows($pts_pg) != 1) {
                     log_crit(sprintf("bin5_points_save: failed at insert point [%s]", $pts_sql));
-                    break;                        
+                    break;
                 }
             }
-
             if ($i < $n)
                 break;
-            
+
             if ($this->query("COMMIT") == FALSE) {
                 break;
             }
-             
+
             $is_trans = FALSE;
 
-            $ret =  TRUE;
+            $table->match_id = $mtc_obj->code;
+            $ret = TRUE;
         } while (0);
-        
+
         if ($is_trans)
             $this->query("ROLLBACK");
-        
+
         return $ret;
     }
 
 } // End class BriskDB
 
-class LoginDBOld 
+class LoginDBOld
 {
     var $item;
     var $item_n;
index 0ae856e..973e012 100644 (file)
@@ -709,7 +709,7 @@ class Sac_a_push {
                         if ($buf == FALSE || mb_strlen($buf, "ASCII") == 0) {
                             // close socket case
                             if ($buf == FALSE) {
-                                printf("ERROR READING\n");
+                                printf("INFO: read return false\n");
                             }
                             if ($sock === $this->list) {
                                 printf("Arrivati %d bytes da list\n", mb_strlen($buf, "ASCII"));
@@ -756,7 +756,7 @@ class Sac_a_push {
 
                                     global_dump();
                                 }
-                                else if ($line == "shutdown") {
+                                else if ($line == "shutdown" || $line == "sd") {
                                     if ($this->app->dump_data()) {
                                         return(0);
                                     }
index 5ebfec4..5f269d7 100644 (file)
@@ -203,6 +203,7 @@ class Transport_websocket {
 
     function chunk($step, $cont)
     {
+        // fprintf(STDERR, "CHUNK: [%s]\n", $cont);
         return $this->frame('@BEGIN@'.$cont.'@END@'); // , 'text', TRUE);
     }
 
@@ -503,6 +504,7 @@ class Transport_xhr {
 
     function chunk($step, $cont)
     {
+        // fprintf(STDERR, "CHUNK: [%s]\n", $cont);
         return ("@BEGIN@".$cont."@END@");
     }
 
@@ -574,6 +576,7 @@ push(\"%s\");
 
     function chunk($step, $cont)
     {
+        // fprintf(STDERR, "CHUNK: [%s]\n", $cont);
         if ($cont == NULL) {
             return sprintf("<script id='hs%d' type='text/javascript'><!--
 push(null);\n// -->\n</script>", $step);
index 2caf30a..0ac092a 100644 (file)
@@ -83,8 +83,8 @@ $mlang_indrd = array(
 
 class User {
   var $room;       // reference to the room where the user is registered
-  var $idx;        // index in the users array when you are in game
-  var $idx_orig;   // index in the users array when you aren't in game
+  var $idx;        // index in the room users array when you are in game
+  var $idx_orig;   // index in the room table users array when you aren't in game
   var $code;       // authentication code
   var $name;       // name of the user
   var $sess;       // session of the user
@@ -640,6 +640,12 @@ class User {
                   for ($i = $cur_step ; $i < $this->step ; $i++) {
                       $ii = $i % COMM_N;
                       log_rd2("ADDED TO THE STREAM: ".$this->comm[$ii]);
+                      if ($this->comm[$ii] == "") {
+                          if ($i == $cur_step)
+                              continue;
+                          else
+                              break;
+                      }
                       $ret .= $this->comm[$ii];
                   }
                   $new_stat =  $this->stat;
index 82fbe90..fa59bbd 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 body {
-    background-image: url('img/snowy.jpg');
+    background-image: url('img/happysunbg.jpg');
     background-color: #fafafa;
     background-repeat: no-repeat;
     background-position: center center; 
index 8388df8..7988b8a 100644 (file)
@@ -2,8 +2,8 @@
 /*
  *  brisk - briskin5.phh
  *
- *  Copyright (C) 2006-2012 Matteo Nastasi
- *                          mailto: nastasi@alternativeoutput.it 
+ *  Copyright (C) 2006-2013 Matteo Nastasi
+ *                          mailto: nastasi@alternativeoutput.it
  *                                  matteo.nastasi@milug.org
  *                          web: http://www.alternativeoutput.it
  *
@@ -22,6 +22,7 @@
  *
  */
 define('BIN5_PLAYERS_N', 3);
+define('BIN5_CARD_HAND', 3); // normal value 8
 define('BIN5_MAX_PLAYERS', BIN5_PLAYERS_N);
 // define(BIN5_SHM_MIN', (50000 * BIN5_MAX_PLAYERS));
 define('BIN5_SHM_MIN', 32768);
@@ -29,34 +30,59 @@ define('BIN5_SHM_MAX', (BIN5_SHM_MIN + 1048576));
 define('BIN5_SHM_DLT', 32768);
 define('BIN5_PROXY_PATH', PROXY_PATH."/bin5");
 
-$mlang_bin5_bin5 = array( 
-                         'info_part' => array( 'it' => '<hr>Nell\'ultima mano ha chiamato <b>%s</b>, il socio era <b>%s</b>,<br>',
-                                               'en' => '<hr>In the last hand the declarer was <b>%s</b>, the partner was <b>%s</b>,<br>'),
-                         'info_capp' => array( 'it' => 'hanno fatto <b>cappotto</b> EBBRAVI!.<br>',
-                                               'en' => 'and they made <b>capot</b> WELL DONE!.<br>'),
-                         'info_pnt'  => array( 'it' => 'dovevano fare <b>%s</b> punti e ne hanno fatti <b>%d</b>: hanno %s.<br>',
-                                               'en' => 'they had to do <b>%s</b> points and they had made <b>%d</b>: they have %s.<br>'),
-                         'info_alea' => array( 'it' => 'almeno ',
-                                               'en' => 'at least '),
-                         'info_more' => array( 'it' => 'pi&ugrave; di 60',
-                                               'en' => 'over 60'),
-                         'info_win'  => array( 'it' => '<b>vinto</b>',
-                                               'en' => '<b>win</b>'),
-                         'info_peer' => array( 'it' => '<b>pareggiato</b>',
-                                               'en' => '<b>drew</b>'),
-                         'info_lost' => array( 'it' => '<b>perso</b>',
-                                               'en' => '<b>lost</b>'),
-
-                         'info_alon' => array( 'it' => '<hr>Nell\'ultima partita <b>%s</b> si &egrave; chiamato in mano,<br>',
-                                               'en' => '<hr>In the last hand <b>%s</b> play alone against each other,<br>'),
-                         'info_apnt' => array( 'it' => 'doveva fare <b>%s</b> punti e ne ha fatti <b>%d</b>: ha %s.<br>',
-                                               'en' => 'he/she had to do <b>%s</b> points and they had made <b>%d</b>: he/she had %s.<br>'),
-                         'info_acap' => array( 'it' => 'ha fatto <b>cappotto</b> EBBRAVO!.<hr>',
-                                               'en' => 'and he/she made <b>capot</b> WELL DONE!.<hr>'),
-                         
-                         'info_omul' => array( 'it' => ' La partita valeva <b>%s</b>.',
-                                               'en' => ' EN: The game was worth <b>%s</b>.' ),
+define('BIN5_RULES_OLDSCHEMA', -1);
+define('BIN5_RULES_FINISH',     0);
+define('BIN5_RULES_ABANDON',    1);
+define('BIN5_RULES_ALLPASS',    2);
+
+$mlang_bin5_bin5 = array(
+                         // br, hr, b, /b, win, fri
+                         'info_part' => array( 'it' => 'Nell\'ultima mano ha chiamato %3$s%5$s%4$s, il socio era %3$s%6$s%4$s,%1$s',
+                                               'en' => 'In the last hand 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' => 'Nell\'ultima partita %3$s%5$s%4$s si Ã¨ chiamato in mano,%1$s',
+                                               'en' => 'In the last hand %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_shuf' => array( 'it' => 'Il mazzo a <b>%s</b>, ',
+                                               'en' => '<b>%s</b> shuffled the cards, '),
                          'info_yturn'=> array( 'it' => ' tocca a <b>te</b> giocare.',
                                                'en' => ' it\'s <b>your</b> turn.'),
                          'info_turn' => array( 'it' => 'tocca a <b>%s</b> giocare.',
@@ -65,8 +91,8 @@ $mlang_bin5_bin5 = array(
                                                '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_shuf' => array( 'it' => 'Il mazzo a <b>%s</b>, ',
-                                               'en' => '<b>%s</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',
@@ -75,8 +101,6 @@ $mlang_bin5_bin5 = array(
                                                'en' => 'Call%s:'),
                          'call_call' => array( 'it' => 'Chiama %s%s:',
                                                'en' => 'The declarer is %s%s:')
-
-                         
                           );
 
 // MLANG
@@ -148,30 +172,34 @@ class Bin5_table extends Table {
     var $asta_pla_n;
     var $asta_card;
     var $asta_pnt;
-  
+
     var $mult;
     var $points;    // points array
     var $points_n;  // number of row of points
     var $total;
 
-    var $asta_win;
+    var $asta_win;          // the caller idx position at table
     var $briscola;
-    var $friend;
-  
+    var $friend;            // the callee idx position at table
+
+    var $match_id;          // the id of the match on the database (-1 == just not saved)
+
+    var $old_act;           // last action that trigs the end of the game
+    var $old_mazzo;
     var $old_reason;
     var $old_asta_pnt;
     var $old_mult;
-    var $old_pnt;
-    var $old_win;
-    var $old_friend;
+    var $old_pnt;           // points made by caller and callee
+    var $old_asta_win;      // the old caller idx position at table
+    var $old_friend;        // the old callee idx position at table
 
-    function Bin5_table() 
+    function Bin5_table()
     {
     }
 
 
     /* CREATE() NOT USED
-       function create($idx) 
+       function create($idx)
        {
        if (($thiz =& new Bin5_table()) == FALSE)
        return (FALSE);
@@ -184,7 +212,7 @@ class Bin5_table extends Table {
        $thiz->asta_card =  -1;
        $thiz->asta_pnt  =  -1;
        $thiz->mult      =   0;
-    
+
        $thiz->points    =   array( );
        $thiz->points_n  =   0;
        $thiz->total     =   array( 0, 0, 0, 0, 0);
@@ -193,11 +221,15 @@ class Bin5_table extends Table {
        $thiz->friend    =  -1;
        $thiz->turn      =   0;
 
+       $thiz->match_id     = -1;
+
+       $thiz->old_act      = -1;
+       $thiz->old_mazzo    = -1;
        $thiz->old_reason   = "";
        $thiz->old_asta_pnt = -1;
        $thiz->old_mult     = -1;
        $thiz->old_pnt      = -1;
-       $thiz->old_win      = -1;
+       $thiz->old_asta_win = -1;
        $thiz->old_friend   = -1;
 
        return ($thiz);
@@ -209,34 +241,38 @@ class Bin5_table extends Table {
        {
        if (($thiz =& new Bin5_table()) == FALSE)
        return (FALSE);
-    
+
        parent::copy($from);
 
-       $thiz->card = $from->card;
-       $thiz->mazzo = $from->mazzo; // REVIEW
-       $thiz->gstart = $from->gstart;
-       $thiz->turn = $from->turn;
-
-       $thiz->asta_pla = $from->asta_pla;
-       $thiz->asta_pla_n = $from->asta_pla_n;
-       $thiz->asta_card = $from->asta_card;
-       $thiz->asta_pnt = $from->asta_pnt;
-    
-       $thiz->mult = $from->mult;
-       $thiz->points = $from->points;
-       $thiz->points_n = $from->points_n;
-       $thiz->total = $from->total;
-    
-       $thiz->asta_win = $from->asta_win;
-       $thiz->briscola = $from->briscola;
-       $thiz->friend = $from->friend;
-    
-       $thiz->old_reason = $from->old_reason;
+       $thiz->card         = $from->card;
+       $thiz->mazzo        = $from->mazzo; // REVIEW
+       $thiz->gstart       = $from->gstart;
+       $thiz->turn         = $from->turn;
+
+       $thiz->asta_pla     = $from->asta_pla;
+       $thiz->asta_pla_n   = $from->asta_pla_n;
+       $thiz->asta_card    = $from->asta_card;
+       $thiz->asta_pnt     = $from->asta_pnt;
+
+       $thiz->mult         = $from->mult;
+       $thiz->points       = $from->points;
+       $thiz->points_n     = $from->points_n;
+       $thiz->total        = $from->total;
+
+       $thiz->asta_win     = $from->asta_win;
+       $thiz->briscola     = $from->briscola;
+       $thiz->friend       = $from->friend;
+
+       $thiz->match_id     = $from->match_id;
+
+       $thiz->old_act      = $from->old_act;
+       $thiz->old_mazzo    = $from->old_mazzo;
+       $thiz->old_reason   = $from->old_reason;
        $thiz->old_asta_pnt = $from->old_asta_pnt;
-       $thiz->old_mult = $from->mult;
-       $thiz->old_pnt = $from->old_pnt;
-       $thiz->old_win = $from->old_win;
-       $thiz->old_friend = $from->old_friend;
+       $thiz->old_mult     = $from->mult;
+       $thiz->old_pnt      = $from->old_pnt;
+       $thiz->old_asta_win = $from->old_asta_win;
+       $thiz->old_friend   = $from->old_friend;
 
        return ($thiz);
        }
@@ -251,7 +287,7 @@ class Bin5_table extends Table {
     {
         if (($thiz =& new Bin5_table()) == FALSE)
             return (FALSE);
-    
+
         $thiz->parentcopy($from);
 
         log_main("PLAYER_N - spawn.".$thiz->player_n);
@@ -259,9 +295,14 @@ class Bin5_table extends Table {
         $thiz->card = array();
         $thiz->bunch_create();
         $thiz->mazzo    = rand(0,PLAYERS_N-1);
+        $thiz->points = array();
+        $thiz->total  = array();
         $thiz->points_n = 0;
         $thiz->mult     = 0;
-        $thiz->old_win    = -1;
+
+        $thiz->match_id     = -1;
+
+        $thiz->old_asta_win = -1;
         $thiz->old_reason = "";
 
         // players are rearranged in an dedicated array
@@ -269,12 +310,12 @@ class Bin5_table extends Table {
         for ($i = 0 ; $i < $from->player_n ; $i++)
             $thiz->player[$i] = $i;
 
-        log_main("TABLE_OLD_WIN - spawn:".$thiz->old_win);
+        log_main("TABLE_OLD_WIN - spawn:".$thiz->old_asta_win);
 
         return ($thiz);
     }
 
-    function asta2mult($asta_pnt)
+    static function asta2mult($asta_pnt)
     {
         if ($asta_pnt > 110)
             return (6);
@@ -293,23 +334,29 @@ class Bin5_table extends Table {
     function multer($is_new)
     {
         if ($is_new) {
-            return (pow(2, $this->mult) * $this->asta2mult($this->asta_pnt));
+            // return (pow(2, $this->mult) * $this->asta2mult($this->asta_pnt));
+            return (static::s_multer($this->mult, $this->asta_pnt));
         }
         else {
-            return (pow(2, $this->old_mult) * $this->asta2mult($this->old_asta_pnt));
+            // return (pow(2, $this->old_mult) * $this->asta2mult($this->old_asta_pnt));
+            return (static::s_multer($this->old_mult, $this->old_asta_pnt));
         }
     }
 
+    static function s_multer($mult, $pnt)
+    {
+        return (pow(2, $mult) * static::asta2mult($pnt));
+    }
 
-    //   function bunch_create_old() function AND 
+    //   function bunch_create_old() function AND
     //   {
     //     $ret = array();
-    // 
-    //     for ($i = 0 ; $i < (BIN5_PLAYERS_N == 5 ? 40 : 24) ; $i++) {
-    //       // for ($i = 0 ; $i < 40 ; $i++) {
+    //
+    //     for ($i = 0 ; $i < (BIN5_CARD_HAND * BIN5_PLAYERS_N) ; $i++) {
+    //       // for ($i = 0 ; $i < (BIN5_CARD_HAND * BIN5_PLAYERS_N) ; $i++) {
     //       $ret[$i] =& new Card($i, 'bunch', 'no_owner');
     //     }
-    // 
+    //
     //     $oret = &$ret;
     //     return ($oret);
     //   }
@@ -317,8 +364,8 @@ class Bin5_table extends Table {
     function bunch_create()
     {
         $ret = array();
-      
-        for ($i = 0 ; $i < (BIN5_PLAYERS_N == 5 ? 40 : 24) ; $i++) {
+
+        for ($i = 0 ; $i < (BIN5_CARD_HAND * BIN5_PLAYERS_N) ; $i++) {
             $this->card[$i] = new Card($i, 'bunch', 'no_owner');
         }
     }
@@ -327,18 +374,18 @@ class Bin5_table extends Table {
     {
         log_main("bunch_make start");
         $ct = array(0,0,0,0,0);
-    
+
         mt_srand(make_seed());
-    
-        for ($i = (BIN5_PLAYERS_N == 5 ? 40 : 24) - 1 ; $i >= 0 ; $i--) 
+
+        for ($i = (BIN5_CARD_HAND * BIN5_PLAYERS_N) - 1 ; $i >= 0 ; $i--)
             $rest[$i] = $i;
 
-        for ($i = (BIN5_PLAYERS_N == 5 ? 40 : 24) - 1 ; $i >= 0 ; $i--) {
+        for ($i = (BIN5_CARD_HAND * BIN5_PLAYERS_N) - 1 ; $i >= 0 ; $i--) {
             $rn = rand(0, $i);
-      
+
             if ($rn == 0)
                 log_main("RND ZERO");
-      
+
             $id = $rest[$rn];
 
             $owner = $i % BIN5_PLAYERS_N;
@@ -356,12 +403,13 @@ class Bin5_table extends Table {
            $this->mazzo    =  rand(0,PLAYERS_N-1);
            $this->points_n =  0;
            $this->mult     =  0;
-           $this->old_win  = -1;
+           $this->old_asta_win  = -1;
            $this->old_reason = "";
         */
         for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
             $this->total[$i] = 0;
             $user_cur = $userarr[$this->player[$i]];
+            $user_cur->stat_set('table');
             $user_cur->exitislock = TRUE;
         }
 
@@ -374,8 +422,7 @@ class Bin5_table extends Table {
 
         $this->gstart = ($this->mazzo+1) % BIN5_PLAYERS_N;
         $this->bunch_make();
-    
-    
+
         $this->asta_pla_n = BIN5_PLAYERS_N;
         $this->asta_card = -1;
         $this->asta_pnt  = 60;
@@ -383,7 +430,7 @@ class Bin5_table extends Table {
         $this->briscola  = -1;
         $this->friend    = -1;
         $this->turn      =  0;
-    
+
         for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
             $this->asta_pla[$i] = TRUE;
             $user_cur = $userarr[$this->player[$i]];
@@ -391,24 +438,35 @@ class Bin5_table extends Table {
             $user_cur->asta_card = -2;
             $user_cur->asta_pnt  = -1;
             $user_cur->handpt = $this->hand_points($i);
-            // SEE function calculate_points(&$table)
         }
         log_rd2("GEND 4");
     }
 
-    function game_next()
+    function game_next($delta)
+    {
+        $this->old_mazzo = $this->mazzo;
+        $this->mazzo  = ($this->mazzo + $delta) % BIN5_PLAYERS_N;
+    }
+
+    function mult_inc($val)
     {
-        $this->mazzo  = ($this->mazzo + 1) % BIN5_PLAYERS_N;
+        $this->old_mult = $this->mult;
+        $this->mult += $val;
     }
 
+    function mult_set($val)
+    {
+        $this->old_mult = $this->mult;
+        $this->mult = $val;
+    }
 
     function hand_points($idx)
     {
-        GLOBAL $G_all_points; 
-    
+        GLOBAL $G_all_points;
+
         $tot = 0;
-    
-        for ($i = 0 ; $i < (BIN5_PLAYERS_N == 5 ? 40 : 24) ; $i++) {
+
+        for ($i = 0 ; $i < (BIN5_CARD_HAND * BIN5_PLAYERS_N) ; $i++) {
             // for ($i = 0 ; $i < 40 ; $i++) {
             if ($this->card[$i]->owner != $idx)
                 continue;
@@ -425,7 +483,7 @@ class Bin5_table extends Table {
     {
         $ct = $this->exitlock_calc($userarr, $table_pos);
 
-        $ret = sprintf('exitlock_show(%d, %s);', $ct, 
+        $ret = sprintf('exitlock_show(%d, %s);', $ct,
                        ($userarr[$this->player[$table_pos]]->exitislock ? 'true' : 'false'));
         return ($ret);
     }
@@ -434,75 +492,363 @@ class Bin5_table extends Table {
     {
         $ct = 0;
 
-        for ($i = 0 , $ct = 0 ; $i < PLAYERS_N ; $i++) {       
+        for ($i = 0 , $ct = 0 ; $i < PLAYERS_N ; $i++) {
             if ($userarr[$this->player[$i]]->exitislock == FALSE)
                 $ct++;
         }
 
         return ($ct);
     }
+
+    function rules_engine(&$bri, $curtime, $action, $user)
+    {
+        GLOBAL $G_all_points, $G_dbasetype;
+
+        $pts = array();
+
+        $this->old_act = $action;
+        if ($action == BIN5_RULES_ALLPASS) { // return TRUE if all correct
+            $this->old_asta_win = -1;
+            $this->old_pnt = 0;
+            $this->mult_inc(1);
+            for ($i = 0 ; $i < PLAYERS_N ; $i++) {
+                $pts[$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
+            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++) {
+                $pts[$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
+            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 ($this->asta_pnt == 61 && $pro == 60) {
+                    $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;
+                        $pts[$i] = 0;
+                    }
+                    $this->points_n++;
+                    $this->old_pnt = $pro;
+                    $this->mult_inc(1);
+
+                    // return($pts);
+                    break;
+                }
+
+                if ($pro >= $this->asta_pnt)
+                    $sig = 1;
+                else
+                    $sig = -1;
+
+                $this->points[$this->points_n % MAX_POINTS] = array();
+                for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                    if ($i == $this->asta_win)
+                        $pt = ($i == $this->friend ? 4 : 2);
+                    else if ($i == $this->friend)
+                        $pt = 1;
+                    else
+                        $pt = -1;
+
+                    log_wr(sprintf("PRO: pt[%d][%d] = %d", $this->points_n % MAX_POINTS, $i, $pt));
+
+                    $pt = $pt * $sig * $this->multer(TRUE) * ($pro == 120 ? 2 : 1);
+
+                    log_wr(sprintf("PRO:[%d][%d][%d]", $sig, $this->multer(TRUE), ($pro == 120 ? 2 : 1)));
+
+                    $this->points[$this->points_n % MAX_POINTS][$i] = $pt;
+                    $this->total[$i] += $pt;
+                    $pts[$i] = $pt;
+                }
+                $this->points_n++;
+                $this->old_pnt = $pro;
+                $this->old_asta_win = $this->asta_win;
+                $this->mult_set(0);
+
+                // return($pts);
+            } 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).'|'.$pts[$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, $bri->user[$this->player[$this->old_asta_win]]->name,
+                                             $this->old_friend, $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, $pts);
+                unset($bdb);
+            }
+            else {
+                log_points($remote_addr, $curtime, $user, "STAT:BRISKIN5:FINISH_GAME", "DATABASE CONNECTION FAILED");
+            }
+            log_points($remote_addr, $curtime, $user, "STAT:BRISKIN5:FINISH_GAME", $plist);
+        }
+
+        $this->game_init(&$bri->user);
+
+        return (TRUE);
+    }
+
+    function match_continue(&$bri, $user, $match_id_s)
+    {
+        $ret = FALSE;
+        $curtime = time();
+
+        do {
+            /* - verify if match_id and user are both valid to accept
+               the match_continue request - */
+            $match_id = (int)$match_id_s;
+            if ($match_id <= 0) {
+                $msg = "questa partita non esiste";
+                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;
+            }
+            // retrieves users list for this match
+            $match_data = array();
+            if (($bdb = BriskDB::create()) != FALSE) {
+                // match_order_get return FALSE for old matches
+                $ucodes = $bdb->match_order_get($match_data, $match_id, BIN5_PLAYERS_N);
+                unset($bdb);
+            }
+            if ($ucodes == FALSE) {
+                $msg = "questa partita non Ã¨ stata memorizzata correttamente";
+                break;
+            }
+
+            // if current user code must be in the users list
+            if (array_search($user->code, $ucodes) === FALSE) {
+                $msg = sprintf("Questo utente non compare nella partita che si vuole continuare [%d].", $user->code);
+                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 - */
+
+            // set the match_id for the current user
+            $user->continue_set($match_id);
+
+            for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                $user_cur = &$bri->user[$this->player[$i]];
+                if ($user_cur->continue_get() != $match_id) {
+                    break;
+                }
+            }
+            $ret = TRUE;
+            // not all players set the continue match than we exit
+            if ($i < BIN5_PLAYERS_N) {
+                $msg = sprintf("<b>L'utente <i>%s</i> vorrebbe continuare la partita n° %d.</b>",
+                               xcape($user->name), $match_id);
+                break;
+            }
+
+            /* - all users decide to continue the same match, update all infos and rearrange users
+               to the right positions on the table - */
+
+            /*  reset users table order */
+            for ($i = 0 ; $i < BIN5_PLAYERS_N - 1 ; $i++) {
+                if ($bri->user[$this->player[$i]]->code == $ucodes[$i]) {
+                    continue;
+                }
+                for ($e = $i + 1 ; $e < BIN5_PLAYERS_N ; $e++) {
+                    if ($bri->user[$this->player[$e]]->code == $ucodes[$i]) {
+                        $swap = $this->player[$i];
+                        $this->player[$i] = $this->player[$e];
+                        $this->player[$e] = $swap;
+                        $bri->user[$this->player[$i]]->table_pos = $i;
+                        $bri->user[$this->player[$e]]->table_pos = $e;
+                    }
+                }
+            }
+            for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                fprintf(STDERR, "USERZ: [%s]\n", $bri->user[$this->player[$i]]->name);
+            }
+
+            // update database info to be aligned with current table (ttok and table_idx
+            if (($bdb = BriskDB::create()) != FALSE) {
+                if ($bdb->match_continue($match_id, $this, $user->table_orig) == FALSE) {
+                    unset($bdb);
+                    $msg = "aggiornamento dei dati della partita fallito";
+                    break;
+                }
+                unset($bdb);
+            }
+
+            /* bunch and multiplier status set */
+            $this->mazzo = $match_data['mazzo_next'];
+            $this->mult  = $match_data['mult_next'];
+            $this->match_id = $match_id;
+            $this->game_init(&$bri->user);
+
+            /* reload of the page with the new layout */
+            for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                $user_cur = &$bri->user[$this->player[$i]];
+                $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);
+                $user_cur->step_inc();
+
+                // a void command force xynt-streamer to flush all data to client
+                $user_cur->trans_step = $user_cur->step + 1;
+                $user_cur->comm[$user_cur->step % COMM_N] = "";
+                $user_cur->step_inc();
+
+                $user_cur->comm[$user_cur->step % COMM_N] = show_table(&$bri, &$user_cur, $user_cur->step+1, TRUE, FALSE);
+                $user_cur->step_inc();
+            }
+            return (TRUE);
+        } while (FALSE);
+
+        $dt = date("H:i ", $curtime);
+        for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+            if ($ret == FALSE && $this->player[$i] != $user->idx)
+                continue;
+            $user_cur = &$bri->user[$this->player[$i]];
+            $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
+            $user_cur->comm[$user_cur->step % COMM_N] .= sprintf('chatt_sub("%s", [2, "%s"],"%s");',
+                                                                 $dt, NICKSERV, $msg);
+            $user_cur->step_inc();
+        }
+    }
+
 } // end class Bin5_table
 
 
 
 
 define('BIN5_USER_FLAG_RING_ENDAUCT', 0x01);
-
+define('BIN5_USER_CONTINUE_INIT', -1);
+define('BIN5_USER_CONTINUE_ALREADY', -2);
 class Bin5_user extends User {
-    var $asta_card;  // 
+    var $asta_card;  //
     var $asta_pnt;   //
     var $handpt;     // Total card points at the beginning of the current hand.
     var $exitislock; // Player can exit from the table ?
-    var $privflags;  // Flags for briskin5 only 
+    var $privflags;  // Flags for briskin5 only
+
+    var $continue;   // Id of the match that the user would continue
 
     const BASE = "../";
-    
+
     function User() {
     }
-    
+
     /* CREATE NOT USED
        function create($name, $sess, $stat = "", $subst = "", $table = -1, $ip="0.0.0.0") {
        if (($thiz =& new User()) == FALSE)
        return (FALSE);
-     
+
        $thiz->asta_card = -2;
        $thiz->asta_pnt  = -1;
        $thiz->handpt = -1;
        $thiz->exitislock = TRUE;
        $thiz->privflags = 0;
-     
+       $thiz->continue = BIN5_USER_CONTINUE_INIT;
+
        return ($thiz);
        }
     */
-    
+
     function parentcopy(&$from)
     {
         parent::copy($from);
     }
-    
+
     function copy(&$from)
     {
         $this->parentcopy($from);
-        
+
         $this->asta_card  = $from->asta_card;
         $this->asta_pnt   = $from->asta_pnt;
         $this->handpt     = $from->handpt;
         $this->exitislock = $from->exitislock;
         $this->privflags  = $from->privflags;
+        $this->continue   = $from->continue;
     }
-    
+
     /* CLONE NOT USED
        function myclone(&$from)
        {
        if (($thiz =& new User()) == FALSE)
        return (FALSE);
-     
+
        $thiz->copy($from);
-     
+
        return ($thiz);
-       } 
+       }
     */
-    
+
     static function spawn($from, &$bri, $table, $table_pos, $get, $post, $cookie)
     {
         if (($thiz = new Bin5_user()) == FALSE)
@@ -513,41 +859,43 @@ class Bin5_user extends User {
         }
 
         $thiz->parentcopy($from);
-        
-        /* NOTE: at this moment idx and table_pos fields have the same value 
+
+        /* NOTE: at this moment idx and table_pos fields have the same value
            but diffentent functions, we keep them separated for a while */
         $thiz->room       = $bri;
-        $thiz->idx        = $table_pos;
+        $thiz->idx        = $table_pos; // it is the position in the mini-room,
+                                        // not related to table pos (see below)
         $thiz->asta_card  = -2;
         $thiz->asta_pnt   = -1;
         $thiz->handpt     = -1;
         $thiz->exitislock = TRUE;
-        
+        $thiz->continue   = BIN5_USER_CONTINUE_INIT;
+
         log_wr("Bin5 constructor");
-        
+
         $thiz->privflags  = ($CO_bin5_pref_ring_endauct == "true" ? BIN5_USER_FLAG_RING_ENDAUCT : 0) | 0;
 
         $thiz->table_orig = $table;
         $thiz->table      = 0;
         $thiz->table_pos  = $table_pos;
-        
+
         $thiz->step_inc();
 
         return ($thiz);
     }
 
-    function step_set($step) 
+    function step_set($step)
     {
         $this->step = $step & 0x7fffffff;
-        
+
         return TRUE;
     }
-    
+
     function step_inc($delta = 1) {
         $this->step += $delta;
         /* modularization because unpack() not manage unsigned 32bit int correctly */
         $this->step &= 0x7fffffff;
-        
+
         return (TRUE);
     }
 
@@ -557,7 +905,7 @@ class Bin5_user extends User {
         do {
             if (validate_sess($sess) == FALSE)
                 break;
-            
+
             if (file_exists(BIN5_PROXY_PATH."/table".$tab_id) == FALSE)
                 mkdir(BIN5_PROXY_PATH."/table".$tab_id, 0775, TRUE);
             if (($fp = @fopen(BIN5_PROXY_PATH."/table".$tab_id."/".$sess.".step", 'rb')) == FALSE)
@@ -568,20 +916,20 @@ class Bin5_user extends User {
                 break;
             $arr = unpack('Ls/Li', $s);
             fclose($fp);
-            
+
             // log_rd2("A0: ".$arr[0]."  A1: ".$arr[1]);
             return ($arr);
         } while (0);
-        
+
         if ($fp != FALSE)
             fclose($fp);
-        
+
         log_rd2("STEP_GET [".$sess."]: return false ");
-        
+
         return (FALSE);
     }
 
-    function save_step() 
+    function save_step()
     {
         do {
             if (validate_sess($this->sess) == FALSE)
@@ -592,15 +940,15 @@ class Bin5_user extends User {
                 break;
             fwrite($fp, pack("LL",$this->step, $this->idx));
             fclose($fp);
-            
-            log_main("step_set [".$this->sess. "] [".$this->step."]"); 
-            
+
+            log_main("step_set [".$this->sess. "] [".$this->step."]");
+
             return (TRUE);
         } while (0);
-        
+
         return (FALSE);
     }
-    
+
     static function unproxy_step($tab_id, $sess)
     {
         log_rd2("UNPROXY: ".BIN5_PROXY_PATH."/table".$tab_id."/".$sess.".step");
@@ -609,15 +957,15 @@ class Bin5_user extends User {
 
         @unlink(BIN5_PROXY_PATH."/table".$tab_id."/".$sess.".step");
     }
-    
-    function destroy_data($tab_id) 
+
+    function destroy_data($tab_id)
     {
         do {
             if (($tok = @ftok(FTOK_PATH."/bin5/table".$tab_id."/user".$this->table_pos, "B")) == -1) {
                 log_crit("BIN5 USER DATA REMOVE FAILED 1 [".FTOK_PATH."/bin5/table".$tab_id."/user".$this->table_pos."]");
                 break;
             }
-          
+
             if (($shm = @shmop_open($tok, 'a', 0, 0)) == FALSE) {
                 log_crit("BIN5 USER DATA REMOVE FAILED 2");
                 break;
@@ -629,14 +977,14 @@ class Bin5_user extends User {
             $shm = FALSE;
 
             log_main("BIN5 USER DATA DESTROY SUCCESS");
-          
+
             // log_main("QUI CI ARRIVA [".$bri->user[0]->name."]");
             $ret = TRUE;
         } while (0);
-      
+
         if ($shm)
             shm_detach($shm);
-      
+
         return ($ret);
     }
 
@@ -645,7 +993,7 @@ class Bin5_user extends User {
         log_crit("BLOCKING_ERROR UNREC: ".($is_unrecoverable ? "TRUE" : "FALSE"));
         return (sprintf(($is_unrecoverable ? 'xstm.stop(); ' : '').'window.onbeforeunload = null; window.onunload = null; document.location.assign("../index.php");'));
     }
-    
+
     protected function page_sync($sess, $page)
     {
         log_rd2("PAGE_SYNC");
@@ -660,31 +1008,31 @@ class Bin5_user extends User {
         GLOBAL $G_splash_w, $G_splash_h, $G_splash_timeout;
         $CO_splashdate = "CO_splashdate".$G_splash_idx;
         $$CO_splashdate = $splashdate;
-        
+
         GLOBAL $S_load_stat;
-        
+
         log_rd("maincheck begin");
-        
+
         $ret = FALSE;
         $curtime = time();
-        
+
       /* Nothing changed, return. */
-      if ($cur_step == $this->step) 
+      if ($cur_step == $this->step)
           return (FALSE);
-      
+
       log_rd2("do other cur_stat[".$cur_stat."] user->stat[".$this->stat."] cur_step[".$cur_step."] user_step[".$this->step."]");
-      
+
       if ($cur_step == -1) {
           /*
            *  if $cur_step == -1 load the current state from the main struct
            */
-          
+
           $S_load_stat['wR_minusone']++;
-          
+
           // if ($this->the_end == TRUE) {
           // log_rd2("main_check: the end".var_export(debug_backtrace()));
           // }
-          
+
           if ($this->trans_step != -1) {
               log_rd2("TRANS USATO ".$this->trans_step);
               $cur_step = $this->trans_step;
@@ -694,12 +1042,12 @@ class Bin5_user extends User {
               log_rd2("TRANS NON ATTIVATO");
           }
       }
-      
-      
+
+
       /* this part I suppose is read only on $this->room structure */
       if ($cur_step == -1) {
           log_rd2("PRE-NEWSTAT");
-              
+
           /***************
            *             *
            *    TABLE    *
@@ -720,7 +1068,7 @@ class Bin5_user extends User {
       else {
           /* $sem = Room::lock_data(FALSE); */
           $S_load_stat['rU_heavy']++;
-          
+
           if ($cur_step < $this->step) {
               do {
                   if ($cur_step + COMM_N < $this->step) {
@@ -735,9 +1083,15 @@ class Bin5_user extends User {
                       printf("xXx LOST HISTORY!\n");
                       $new_step = -1;
                       break;
-                  } 
+                  }
                   for ($i = $cur_step ; $i < $this->step ; $i++) {
                       $ii = $i % COMM_N;
+                      if ($this->comm[$ii] == "") {
+                          if ($i == $cur_step)
+                              continue;
+                          else
+                              break;
+                      }
                       log_rd2("ADDED TO THE STREAM: ".$this->comm[$ii]);
                       $ret .= $this->comm[$ii];
                   }
@@ -745,17 +1099,17 @@ class Bin5_user extends User {
                   $new_subst = $this->subst;
                   $new_step =  $this->step;
               } while (0);
-              
+
               log_rd2($this->step, 'index_rd.php: after ret set');
-              
+
               if ($this->the_end == TRUE) {
                   log_rd2("LOGOUT BYE BYE!!");
                   log_auth($this->sess, "Explicit logout.");
-                  
+
                   if ($this->the_end == TRUE) {
                       $this->reset();
-                      
-                      // FIXME !!! 
+
+                      // FIXME !!!
                       /* if ($this->subst == 'sitdown') { */
                       /*     log_load("ROOM WAKEUP"); */
                       /*     $this->room->room_wakeup($this); */
@@ -764,27 +1118,30 @@ class Bin5_user extends User {
                       /*     $this->room->room_outstandup($this); */
                       /* else */
                       /*     log_rd2("LOGOUT FROM WHAT ???"); */
-                      
+
                   } /* if ($this->the_end == TRUE) { ... */
               } /* if ($this->the_end == TRUE) { ... */
           } /* if ($cur_step < $this->step) { */
-          
+
           /* Room::unlock_data($sem); */
       }  /* else of if ($cur_step == -1) { */
-      
-    
-      return ($ret);
-  }  //   function maincheck (...
-
 
 
+      return ($ret);
+    }  //   function maincheck (...
 
+    function continue_set($match_code)
+    {
+        $this->continue = $match_code;
+    }
 
+    function continue_get() {
+        return ($this->continue);
+    }
 
 } // end class Bin5_user
 
 
-
 class Bin5 {
     static $delta_t = array();
 
@@ -794,10 +1151,10 @@ class Bin5 {
     var $step; // current step of the comm array
     var $garbage_timeout;
     var $shm_sz;
-    
+
     var $table_idx;
     var $table_token;
-    
+
     var $the_end;
     var $tok;
 
@@ -806,41 +1163,41 @@ class Bin5 {
     function Bin5 ($room, $table_idx, $table_token, $get, $post, $cookie) {
         $this->user = array();
         $this->table = array();
-        
+
         $this->the_end = FALSE;
         $this->shm_sz = BIN5_SHM_MIN;
         if (($this->tok = @ftok(FTOK_PATH."/bin5/table".$table_idx."/table", "B")) == -1) {
             echo "FTOK FAILED";
             exit;
         }
-        
+
         $user  = $room->user;
         $table = $room->table[$table_idx];
-        
+
         log_wr("Bin5 constructor");
-        
+
         for ($i = 0 ; $i < $table->player_n ; $i++) {
             $user[$table->player[$i]]->table_token = $table_token;
             $this->user[$i] = Bin5_user::spawn($user[$table->player[$i]], $this, $table_idx, $i, $get, $post, $cookie);
         }
         $this->table[0] = Bin5_table::spawn(&$table);
-        
-        log_main("TABLE_OLD_WIN - Bin5:".$this->table[0]->old_win);
-        
+
+        log_main("TABLE_OLD_WIN - Bin5:".$this->table[0]->old_asta_win);
+
         $this->table_idx = $table_idx;
         $this->table_token = $table_token;
         $this->garbage_timeout = 0;
-        
+
         $this->delay_mgr = new Delay_Manager((GARBAGE_TIMEOUT *3.0) / 2.0);
 
         log_wr("Bin5 constructor end");
     }
-    
+
 
     function get_user($sess, &$idx)
     {
         GLOBAL $PHP_SELF;
-        
+
         if (validate_sess($sess)) {
             for ($i = 0 ; $i < BIN5_MAX_PLAYERS ; $i++) {
                 if (strcmp($sess, $this->user[$i]->sess) == 0) {
@@ -851,21 +1208,21 @@ class Bin5 {
                 }
             }
             log_main(sprintf("get_user: Wrong sess from page [%s]",$PHP_SELF));
-            // for ($i = 0 ; $i < BIN5_MAX_PLAYERS ; $i++) 
+            // for ($i = 0 ; $i < BIN5_MAX_PLAYERS ; $i++)
             // log_main(sprintf("get_user: Wrong sess compared with [%s]",$this->user[$i]->sess));
         }
         else {
             log_main(sprintf("get_user: Wrong strlen [%s]",$sess));
         }
-        
+
         return (FALSE);
     }
-    
-    
+
+
     function garbage_manager($force)
     {
         GLOBAL $G_base;
-        
+
         /* Garbage collector degli utenti in timeout */
         $ismod = FALSE;
         $curtime = time();
@@ -875,26 +1232,26 @@ class Bin5 {
         if ($force || $this->garbage_timeout < $curtime) {
             for ($i = 0 ; $i < BIN5_MAX_PLAYERS ; $i++) {
                 $user_cur = $this->user[$i];
-                if ($user_cur->sess == "" || 
+                if ($user_cur->sess == "" ||
                     ($user_cur->stat == 'table' && ($user_cur->subst == 'shutdowned' || $user_cur->subst == 'shutdowner')))
                     continue;
-                
+
                 if ($user_cur->lacc + EXPIRE_TIME_RD < ($curtime - $delta)) { // Auto logout dell'utente
                     log_rd2($user_cur->sess." bin5 AUTO LOGOUT.");
-                    
+
                     if ($user_cur->stat == 'table') {
                         log_auth($user_cur->sess," bin5 Autologout session.");
-                        
-                        /* SI DELEGA AL garbage_manager principale LA RIMOZIONE DELL'UTENTE 
-                           
+
+                        /* SI DELEGA AL garbage_manager principale LA RIMOZIONE DELL'UTENTE
+
                            $tmp_sess = $user_cur->sess;
                            $user_cur->sess = "";
                            Bin5_user::step_unproxy($tmp_sess);
                            $user_cur->name = "";
                            $user_cur->the_end = FALSE;
-                           
+
                         */
-                        
+
                         /* se gli altri utenti non erano d'accordo questo utente viene bannato */
                         $remcalc = $this->table[0]->exitlock_calc(&$this->user, $user_cur->table_pos);
                         if ($remcalc < 3) {
@@ -903,58 +1260,58 @@ class Bin5 {
                                           $user_cur->ip, $user_cur->sess, $user_cur->laccwr + BAN_TIME);
                         }
                         //      $user->bantime = $user->laccwr + BAN_TIME;
-                        
+
                         $this->table_wakeup($user_cur);
                     }
                 }
             }
             log_rd2($user_cur->sess." GARBAGE UPDATED!");
-            
+
             $this->garbage_timeout = $curtime + GARBAGE_TIMEOUT;
-            
+
             $ismod = TRUE;
         }
-        
+
         $this->delay_mgr->lastcheck_set($curtime);
         return ($ismod);
     }
-    
 
-    function destroy_data() 
+
+    function destroy_data()
     {
         GLOBAL $sess;
 
         $ret =   FALSE;
         $shm =   FALSE;
         log_main("DESTROY BRISKIN5 DATA");
-    
+
         do {
             log_main("DESTROY2 BRISKIN5 DATA [".$this->table_idx."]");
             for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                 $this->user[$i]->destroy_data($this->table_idx);
                 Bin5_user::unproxy_step($this->table_idx, $this->user[$i]->sess);
             }
-            if (($tok = @ftok(FTOK_PATH."/bin5/table".$this->table_idx."/table", "B")) == -1) 
+            if (($tok = @ftok(FTOK_PATH."/bin5/table".$this->table_idx."/table", "B")) == -1)
                 break;
 
             if (($shm = @shmop_open($tok, 'a', 0, 0)) == FALSE)
                 break;
-      
+
             if (shmop_delete($shm) == 0) {
                 log_only("REMOVE FALLITA ");
                 break;
             }
-   
+
             $shm = FALSE;
             log_main("DESTROY2 BRISKIN5 DATA SUCCESS");
-      
+
             // log_main("QUI CI ARRIVA [".$bri->user[0]->name."]");
             $ret = TRUE;
         } while (0);
-    
+
         if ($shm)
             shm_detach($shm);
-    
+
         return ($ret);
     }
 
@@ -963,17 +1320,17 @@ class Bin5 {
         if (($res = file_lock(FTOK_PATH."/bin5/table".$table_idx."/table", $is_exclusive)) != FALSE) {
             self::$delta_t = microtime(TRUE);
             log_lock("LOCK   table [".$table_idx."]         [".self::$delta_t[$table_idx]."]");
-          
+
             return (new Vect(array('res' => $res, 'tab' => $table_idx)));
         }
-      
+
         return (FALSE);
     }
 
-  
+
     static function unlock_data($res_vect)
     {
-        GLOBAL $sess; 
+        GLOBAL $sess;
 
         $res = $res_vect->getbyid('res');
         $tab = $res_vect->getbyid('tab');
@@ -988,95 +1345,23 @@ class Bin5 {
     {
         GLOBAL $mlang_brisk, $G_lang;
 
-        if ($user->stat == 'table') {
-            $table = &$this->table[$user->table];
+        if ($user->stat != 'table') {
+            return;
         }
-    
-        $user_mesg = substr($mesg,6);
-    
         $curtime = time();
-    
-        $dt = date("H:i ", $curtime);
-        if (strncmp($user_mesg, "/nick ", 6) == 0) {
-            log_main($user->sess." chatt_send BEGIN");
 
-            if (($name_new = validate_name(substr($user_mesg, 6))) == FALSE) {
-                $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
-                $user->comm[$user->step % COMM_N] .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $mlang_brisk['nickmust'][$G_lang]);
-                $user->step_inc();
-
-                return;
-            }
-            $user_mesg = "COMMAND ".$user_mesg;
-            // Search dup name
-            // change
-            // update local graph
-            // update remote graphs
-            for ($i = 0 ; $i < BIN5_MAX_PLAYERS ; $i++) {
-                $user_cur = $this->user[$i];
-                //     if ($user_cur->sess == '' || $user_cur->stat != 'room')
-                if ($user_cur->sess == '')
-                    continue;
-                if (strcasecmp($user_cur->name, $name_new) == 0) {
-                    $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
+        $table = &$this->table[$user->table];
+        $user_mesg = substr($mesg,6);
 
-                    $premsg = sprintf($mlang_brisk['nickdupl'][$G_lang], xcape($name_new));
-                    $user->comm[$user->step % COMM_N] .= sprintf('chatt_sub("%s", [2, "%s"],"%s");', $dt, NICKSERV, $premsg);
-                    $user->step_inc();
-                    break;
-                }
-            }
-            if ($i == BIN5_MAX_PLAYERS) {
-                if ($user->flags & USER_FLAG_AUTH && strcasecmp($user->name,$name_new) != 0) {
-                    if ($this->table[$user->table]->auth_only == TRUE) {
-                        $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
-                        $user->comm[$user->step % COMM_N] .= sprintf('chatt_sub("%s", [2, "%s"],"<b>%s</b>");', $dt, NICKSERV, $mlang_brisk['authchan'][$G_lang]);
-                        $user->step_inc();
-                        return;
-                    }
-                    else {
-                        $user->flags &= ~USER_FLAG_AUTH; // Remove auth if name changed
-                    }
-                }
-    
-                $user->name = $name_new;
+        $ret = FALSE;
+        $mesg = "";
 
-                log_main($user->sess." chatt_send start set");
-       
+        $dt = date("H:i ", $curtime);
+        if (strncmp($user_mesg, "/cont ", 6) == 0) {
+            log_main($user->sess." chatt_send BEGIN");
 
-                for ($i = 0 ; $i < BIN5_MAX_PLAYERS ; $i++) {
-                    log_main($user->sess." chatt_send set loop");
-         
-                    $user_cur = &$this->user[$i];
-                    if ($user_cur->sess == '')
-                        continue;
-          
-                    if ($user_cur->stat == 'table' && $user_cur->table == $user->table) {
-                        $table = &$this->table[$user->table];
-           
-                        $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
-                        $user_cur->comm[$user_cur->step % COMM_N] .= sprintf('set_names([%d, "%s"], [%d, "%s"], [%d, "%s"], [%d, "%s"], [%d, "%s"]); ',
-                                                                             $this->user[$table->player[($user_cur->table_pos) % BIN5_PLAYERS_N]]->flags,
-                                                                             xcape($this->user[$table->player[($user_cur->table_pos) % BIN5_PLAYERS_N]]->name),
-
-                                                                             $this->user[$table->player[($user_cur->table_pos+1) % BIN5_PLAYERS_N]]->flags,
-                                                                             xcape($this->user[$table->player[($user_cur->table_pos+1) % BIN5_PLAYERS_N]]->name),
-
-                                                                             $this->user[$table->player[($user_cur->table_pos+2) % BIN5_PLAYERS_N]]->flags,
-                                                                             xcape($this->user[$table->player[($user_cur->table_pos+2) % BIN5_PLAYERS_N]]->name),
-
-                                                                             (BIN5_PLAYERS_N == 3 ? 0:  $this->user[$table->player[($user_cur->table_pos+3) % BIN5_PLAYERS_N]]->flags),
-                                                                             (BIN5_PLAYERS_N == 3 ? "" :  xcape($this->user[$table->player[($user_cur->table_pos+3) % BIN5_PLAYERS_N]]->name)),
-
-                                                                             (BIN5_PLAYERS_N == 3 ? 0:  $this->user[$table->player[($user_cur->table_pos+4) % BIN5_PLAYERS_N]]->flags),
-                                                                             (BIN5_PLAYERS_N == 3 ? "" :  xcape($this->user[$table->player[($user_cur->table_pos+4) % BIN5_PLAYERS_N]]->name)));
-                        if ($user_cur == $user) {
-                            $user_cur->comm[$user_cur->step % COMM_N] .= $user_cur->myname_innerHTML();
-                        }
-                        $user_cur->step_inc();
-                    }
-                }
-            }
+            $match_id = substr($user_mesg, 6);
+            $table->match_continue($this, $user, $match_id);
         }
         else {
             for ($i = 0 ; $i < ($user->stat == 'room' ? BIN5_MAX_PLAYERS : BIN5_PLAYERS_N) ; $i++) {
@@ -1088,7 +1373,7 @@ class Bin5 {
                 else {
                     $user_cur = &$this->user[$table->player[$i]];
                 }
-       
+
                 $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ";
                 $user_cur->comm[$user_cur->step % COMM_N] .= sprintf('chatt_sub("%s", [%d, "%s"],"%s");',
                                                                      $dt, $user->flags, xcape($user->name), xcape($user_mesg));
@@ -1107,11 +1392,11 @@ class Bin5 {
         $curtime = time();
 
         log_main("BIN5_WAKEUP from table [".$user->table."] nplayers_n: ".$this->table[$user->table]->player_n);
-    
+
         for ($i = 0 ; $i < $table->player_n ; $i++) {
             $user_cur = &$this->user[$i];
             log_main("PREIMPOST INLOOP name: ".$user_cur->name);
-      
+
             if ($user_cur == $user)
                 $user_cur->subst = "shutdowner";
             else
@@ -1128,11 +1413,11 @@ class Bin5 {
 
         $this->the_end = TRUE;
     }
-  
+
     /*
      *  If all players are freezed the room garbage_manager clean up table and users.
-     */ 
-    function is_abandoned() 
+     */
+    function is_abandoned()
     {
         $is_ab = TRUE;
         $curtime = time();
@@ -1142,7 +1427,7 @@ class Bin5 {
         for ($i = 0 ; $i < $table->player_n ; $i++) {
             $user_cur = &$this->user[$i];
 
-            if ($user_cur->lacc + (EXPIRE_TIME_RD * 2) >= $curtime) { 
+            if ($user_cur->lacc + (EXPIRE_TIME_RD * 2) >= $curtime) {
                 $is_ab = FALSE;
                 break;
             }
@@ -1156,7 +1441,7 @@ class Bin5 {
         GLOBAL $G_black_list;
 
         printf("NEW_SOCKET (root): %d\n", intval($new_socket));
-        
+
         $enc = get_encoding($header);
         if (isset($header['User-Agent'])) {
             if (strstr($header['User-Agent'], "MSIE")) {
@@ -1171,10 +1456,10 @@ class Bin5 {
         }
         force_no_cache($header_out);
 
-        if (($table_idx = gpcs_var('table_idx', $get, $post, $cookie)) === FALSE) 
+        if (($table_idx = gpcs_var('table_idx', $get, $post, $cookie)) === FALSE)
             unset($table_idx);
-        
-        if (($table_token = gpcs_var('table_token', $get, $post, $cookie)) === FALSE) 
+
+        if (($table_token = gpcs_var('table_token', $get, $post, $cookie)) === FALSE)
             unset($table_token);
 
 
@@ -1185,10 +1470,10 @@ class Bin5 {
             bin5_index_main($transp_type, $header_out, $addr, $get, $post, $cookie);
             $content = ob_get_contents();
             ob_end_clean();
-        
+
             $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
             return TRUE;
-        
+
         break;
         case "index_wr.php":
             // FIXME $content can be unset
@@ -1208,7 +1493,7 @@ class Bin5 {
             }
             $s_a_p->pendpage_try_addflush($new_socket, 20, $enc, $header_out, $content);
             return TRUE;
-            
+
             break;
         case "index_rd_ifra.php":
             if (($transp  = gpcs_var('transp', $get, $post, $cookie)) === FALSE)
@@ -1236,13 +1521,13 @@ class Bin5 {
                     printf("CLOSE AND OPEN AGAIN ON IFRA2\n");
                     $user->rd_socket_set(NULL);
                 }
-                
+
                 $content = "";
                 $user->stream_init($s_a_p->rndstr, $enc, $header, $header_out, $content, $get, $post, $cookie);
 
                 $response = headers_render($header_out, -1).$user->chunked_content($content);
                 $response_l = mb_strlen($response, "ASCII");
-                
+
                 $wret = @fwrite($new_socket, $response, $response_l);
                 if ($wret < $response_l) {
                     printf("TROUBLES WITH FWRITE: %d\n", $wret);
@@ -1252,17 +1537,17 @@ class Bin5 {
                     $user->rd_cache_set("");
                 }
                 fflush($new_socket);
-                
-                
+
+
                 $s_a_p->socks_set($new_socket, $user, NULL);
                 $user->rd_socket_set($new_socket);
                 printf(" - qui ci siamo - ");
                 return TRUE;
             } while (FALSE);
-            
+
             return FALSE;
             break;
-            
+
         default:
             return FALSE;
             break;
@@ -1290,86 +1575,11 @@ function locshm_exists($tok)
 
         return (TRUE);
     }
-    
-}
-
-
-// rendiamo qui l'elenco dei punti come return della func
-function calculate_points(&$table)
-{
-    GLOBAL $G_all_points; 
-
-    $ret = array();
-    $pro = 0;
-
-    if ($table->asta_pnt == 60)
-        $table->asta_pnt = 61;
-
-    $table->old_reason = "";
-    $table->old_win = $table->asta_win;
-    $table->old_friend = $table->friend;
-    $table->old_asta_pnt = $table->asta_pnt;
-    $table->old_mult = $table->mult;
-
-    // count points for the temporary 2 teams
-    for ($i = 0 ; $i < (BIN5_PLAYERS_N == 5 ? 40 : 24) ; $i++) {
-        // for ($i = 0 ; $i < 40 ; $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 ($table->asta_pnt == 61 && $pro == 60) {
-        $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;
-            $ret[$i] = 0;
-        }
-        $table->points_n++;
-        $table->old_pnt = $pro;
-        $table->mult += 1;
-
-        return($ret);
-    }
-
-    if ($pro >= $table->asta_pnt) 
-        $sig = 1;
-    else
-        $sig = -1;
 
-    $table->points[$table->points_n % MAX_POINTS] = array();
-    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-        if ($i == $table->asta_win) 
-            $pt = ($i == $table->friend ? 4 : 2);
-        else if ($i == $table->friend) 
-            $pt = 1;
-        else
-            $pt = -1;
-    
-    
-
-        log_wr(sprintf("PRO: pt[%d][%d] = %d", $table->points_n % MAX_POINTS, $i, $pt));
-
-        $pt = $pt * $sig * $table->multer(TRUE) * ($pro == 120 ? 2 : 1);
-
-        log_wr(sprintf("PRO:[%d][%d][%d]", $sig, $table->multer(TRUE), ($pro == 120 ? 2 : 1)));
-    
-        $table->points[$table->points_n % MAX_POINTS][$i] = $pt;
-        $table->total[$i] += $pt;
-        $ret[$i] = $pt;
-    }
-    $table->points_n++;
-    $table->old_pnt = $pro;
-    $table->mult = 0;
-  
-    return($ret);
 }
 
-/* show table 
+
+/* show table
    is_transition (is from room to table ?)
    is_again      (is another game)
 
@@ -1396,7 +1606,7 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
 
         /* BACKGROUND */
         $ret .= "background_set();";
-    
+
         /* USERS INFO */
         $ret .= $user->myname_innerHTML();
         $ret .= sprintf('set_names([%d, "%s"], [%d, "%s"], [%d, "%s"], [%d, "%s"], [%d, "%s"]); ',
@@ -1420,7 +1630,10 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
         $ret .= show_table_info(&$bri, &$table, $table_pos);
         $ret .= "setTimeout(preload_images, 500, g_preload_img_arr, g_imgct);";
     }
-    if (!$is_again) 
+    else {
+        $ret .= "\$('imgct').innerHTML = \$('imgct').innerHTML = mlang_commons['imgload_a'][g_lang]+\"100%.\";";
+    }
+    if (!$is_again)
         $ret .= table_welcome($user);
 
     if ($is_transition && !$is_again) { // appena seduti al tavolo, play della mucca
@@ -1431,11 +1644,11 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
     /* CARDS */
     if ($is_transition) { //  && $user->subst ==  "asta" superfluo
         $ret .= "|";
-    
-        for ($i = 0 ; $i < 8 ; $i++) {
+
+        for ($i = 0 ; $i < BIN5_CARD_HAND ; $i++) {
             for ($e = 0 ; $e < BIN5_PLAYERS_N ; $e++) {
                 $ct = 0;
-                for ($o = 0 ; $o < (BIN5_PLAYERS_N == 5 ? 40 : 24) && $ct < $i+1 ; $o++) {
+                for ($o = 0 ; $o < (BIN5_CARD_HAND * BIN5_PLAYERS_N) && $ct < $i+1 ; $o++) {
                     // for ($o = 0 ; $o < 40 && $ct < $i+1 ; $o++) {
                     if ($table->card[$o]->owner == (($e + $table->gstart) % BIN5_PLAYERS_N)) {
                         $ct++;
@@ -1444,13 +1657,13 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
                     }
                 }
                 log_rd("O ".$o." VAL ".$table->card[$o]->value." Owner: ".$table->card[$o]->owner);
-       
-                $ret .= sprintf( ' card_send(%d,%d,%d,%8.2f,%d);|', ($table->gstart + $e) % BIN5_PLAYERS_N, 
+
+                $ret .= sprintf( ' card_send(%d,%d,%d,%8.2f,%d);|', ($table->gstart + $e) % BIN5_PLAYERS_N,
                                  $i, ((($e + BIN5_PLAYERS_N - $table_pos + $table->gstart) % BIN5_PLAYERS_N) == 0 ?
-                                      $table->card[$o]->value : -1), 
+                                      $table->card[$o]->value : -1),
                                  ($i == 7 && $e == (BIN5_PLAYERS_N - 1) ? 1 : 0.5),$i+1);
             }
-        }    
+        }
     }
     else {
         $taked  = array(0,0,0,0,0);
@@ -1458,7 +1671,7 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
         $ontabl  = array(-1,-1,-1,-1,-1);
         $cards  = array();
 
-        for ($i = 0 ; $i < (BIN5_PLAYERS_N == 5 ? 40 : 24) ; $i++) {
+        for ($i = 0 ; $i < (BIN5_CARD_HAND * BIN5_PLAYERS_N) ; $i++) {
             // for ($i = 0 ; $i < 40 ; $i++) {
             if ($table->card[$i]->stat == 'hand') {
                 if ($table->card[$i]->owner == $table_pos) {
@@ -1482,9 +1695,9 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
 
         /* Set ours cards. */
         $oursarg = "";
-        for ($i = 0 ; $i < $inhand[$table_pos] ; $i++) 
+        for ($i = 0 ; $i < $inhand[$table_pos] ; $i++)
             $oursarg .= ($i == 0 ? "" : ", ").$cards[$i];
-        for ($i = $inhand[$table_pos] ; $i < 8 ; $i++) 
+        for ($i = $inhand[$table_pos] ; $i < BIN5_CARD_HAND ; $i++)
             $oursarg .= ($i == 0 ? "" : ", ")."-1";
         $ret .= sprintf('card_setours(%s);', $oursarg);
 
@@ -1492,11 +1705,11 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
         for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
             /* Qui sotto al posto di + 1 c'era + ->gstart ... credo in modo errato */
             $ret .= sprintf('cards_dispose(%d,%d,%d);', $i,
-                            ($inhand[$i] <= 8 ? $inhand[$i] : 8)  , $taked[$i]);
+                            ($inhand[$i] <= BIN5_CARD_HAND ? $inhand[$i] : BIN5_CARD_HAND), $taked[$i]);
 
             if ($ontabl[$i] != -1) {
-                $ret .= sprintf('card_place(%d,%d,%d,%d,%d);',$i, $inhand[$i], 
-                                $table->card[$ontabl[$i]]->value, 
+                $ret .= sprintf('card_place(%d,%d,%d,%d,%d);',$i, $inhand[$i],
+                                $table->card[$ontabl[$i]]->value,
                                 $table->card[$ontabl[$i]]->x, $table->card[$ontabl[$i]]->y);
             }
         }
@@ -1509,7 +1722,7 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
         $showst = "";
         for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
             $user_cur = &$bri->user[$table->player[$i]];
-            $showst .= sprintf("%s%d", ($i == 0 ? "" : ", "), 
+            $showst .= sprintf("%s%d", ($i == 0 ? "" : ", "),
                                ($user_cur->asta_card < 9 ? $user_cur->asta_card : $user_cur->asta_pnt));
         }
         if (BIN5_PLAYERS_N == 3)
@@ -1525,8 +1738,8 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
         else {
             /* show auction */
             if ($table_pos == ($table->gstart % BIN5_PLAYERS_N) &&
-                $table->asta_win == -1) 
-                $ret .= sprintf('dispose_asta(%d,%d, %s);', 
+                $table->asta_win == -1)
+                $ret .= sprintf('dispose_asta(%d,%d, %s);',
                                 $table->asta_card + 1, $table->asta_pnt+1, ($user->handpt <= 2 ? "true" : "false"));
             else
                 $ret .= sprintf('dispose_asta(%d,%d, %s);',
@@ -1535,13 +1748,13 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
 
         /* Remark */
         if ($table->asta_win == -1) { // auction case
-            if ($table_pos == ($table->gstart % BIN5_PLAYERS_N)) 
+            if ($table_pos == ($table->gstart % BIN5_PLAYERS_N))
                 $ret .= "remark_on();";
             else
                 $ret .= "remark_off();";
         }
         else { // chooseed case
-            if ($table_pos == $table->asta_win) 
+            if ($table_pos == $table->asta_win)
                 $ret .= "remark_on();";
             else
                 $ret .= "remark_off();";
@@ -1549,14 +1762,14 @@ function show_table(&$bri, &$user, $sendstep, $is_transition, $is_again)
     }
     else if ($user->subst == 'game') {
         /* HIGHLIGHT */
-        if (($table->gstart + $table->turn) % BIN5_PLAYERS_N == $table_pos) 
+        if (($table->gstart + $table->turn) % BIN5_PLAYERS_N == $table_pos)
             $ret .= "is_my_time = true; remark_on();";
         else
             $ret .= "remark_off();";
-    
+
         /* WHO CALL AND WHAT */
         $ret .= briscola_show($bri, $table, $user);
-    
+
     }
     return ($ret);
 } // end function show_table(...
@@ -1570,14 +1783,14 @@ function calculate_winner(&$table)
     $cur_val  = 100;
     $cur_seed = $table->briscola - ($table->briscola % 10);
 
-    for ($i = 0 ; $i < (BIN5_PLAYERS_N == 5 ? 40 : 24) ; $i++) {
+    for ($i = 0 ; $i < (BIN5_CARD_HAND * BIN5_PLAYERS_N) ; $i++) {
         // for ($i = 0 ; $i < 40 ; $i++) {
         if ($table->card[$i]->stat != "table")
             continue;
 
         log_wr(sprintf("Card On table: [%d]", $i));
 
-        $v = $table->card[$i]->value; 
+        $v = $table->card[$i]->value;
         $ontab[$table->card[$i]->owner] = $v;
         $ontid[$table->card[$i]->owner] = $i;
         /* se briscola setto il flag */
@@ -1616,9 +1829,9 @@ function show_table_info(&$bri, &$table, $table_pos)
 
     $pnt_min = $table->points_n - MAX_POINTS < 0 ? 0 : $table->points_n - MAX_POINTS;
     $noty = sprintf('<table class=\"points\"><tr><th></th>');
-  
+
     // Names.
-    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) 
+    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++)
         $noty .= sprintf('<th class=\"td_points\">%s</th>', xcape($bri->user[$table->player[$i]]->name));
     $noty .= sprintf("</tr>");
 
@@ -1627,68 +1840,23 @@ function show_table_info(&$bri, &$table, $table_pos)
 
     for ($i = $pnt_min ; $i < $table->points_n ; $i++) {
         $noty .= sprintf('<tr><th class=\"td_points\">%d</th>', $i+1);
-        for ($e = 0 ; $e < BIN5_PLAYERS_N ; $e++) 
+        for ($e = 0 ; $e < BIN5_PLAYERS_N ; $e++)
             $noty .= sprintf('<td class=\"td_points\">%d</td>', $table->points[$i % MAX_POINTS][$e]);
         $noty .= "</tr>";
     }
 
     // Total points.
     $noty .= '<tr><th class=\"td_points\">Tot.</th>';
-    for ($e = 0 ; $e < BIN5_PLAYERS_N ; $e++) 
+    for ($e = 0 ; $e < BIN5_PLAYERS_N ; $e++)
         $noty .= sprintf('<td class=\"td_points\">%d</td>', $table->total[$e]);
     $noty .= "</tr></table>";
-
+    $noty .= "<hr>";
     if ($table->old_reason != "") {
-        $noty .= sprintf("<hr><b>%s</b><br>", xcape($table->old_reason));
+        $noty .= $table->old_reason;
     }
 
-    if ($table->old_win != -1) {
-        log_main("TABLE_OLD_WIN:".$table->old_win);
-        $win = $table->player[$table->old_win];
-        log_main("TABLE_OLD_FRIEND:".$table->old_friend);
-        $fri = $table->player[$table->old_friend];
-
-        $wol = game_result($table->old_asta_pnt, $table->old_pnt);
-
-        if ($win != $fri) {
-            /* 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], 
-                             xcape($bri->user[$win]->name),
-                             xcape($bri->user[$fri]->name));
-            if ($table->old_pnt == 120) {
-                $noty .= sprintf($mlang_bin5_bin5['info_capp'][$G_lang]);
-            }
-            else {
-                $noty .= sprintf($mlang_bin5_bin5['info_pnt'][$G_lang],
-                                 ($table->old_asta_pnt > 61 ? $mlang_bin5_bin5['info_alea'][$G_lang].$table->old_asta_pnt :
-                                  $mlang_bin5_bin5['info_more'][$G_lang]), $table->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_alon'][$G_lang],
-                             xcape($bri->user[$win]->name));
-            if ($table->old_pnt == 120) {
-                $noty .= sprintf($mlang_bin5_bin5['info_acap'][$G_lang]);
-            }
-            else {
-                $noty .= sprintf($mlang_bin5_bin5['info_apnt'][$G_lang],
-
-                                 ($table->old_asta_pnt > 61 ? $mlang_bin5_bin5['info_alea'][$G_lang].$table->old_asta_pnt :
-                                  $mlang_bin5_bin5['info_more'][$G_lang]), $table->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 = $table->multer(FALSE);
-        if ($old_multer > 1) {
-            $noty .= sprintf($mlang_bin5_bin5['info_omul'][$G_lang], multoval($old_multer));
-        }
-        $noty .= "<hr><br>";
-    }
     /* MLANG: "Fai <b>tu</b> il mazzo,", "Il mazzo a <b>$unam</b>," */
-    if ($table->mazzo == $table_pos) 
+    if ($table->mazzo == $table_pos)
         $noty .= $mlang_bin5_bin5['info_yshuf'][$G_lang];
     else {
         $unam = xcape($bri->user[$table->player[$table->mazzo]]->name);
@@ -1698,7 +1866,7 @@ function show_table_info(&$bri, &$table, $table_pos)
     if ($user->subst == 'asta') {
         if ($table->asta_win == -1)  // auction case
             $curplayer = $table->gstart % BIN5_PLAYERS_N;
-        else 
+        else
             $curplayer = $table->asta_win;
     }
     else if ($user->subst == 'game') {
@@ -1713,20 +1881,24 @@ function show_table_info(&$bri, &$table, $table_pos)
         $unam = xcape($bri->user[$table->player[$curplayer]]->name);
         $noty .= sprintf($mlang_bin5_bin5['info_turn'][$G_lang], $unam);
     }
-  
+
     $multer = $table->multer(TRUE);
     if ($multer > 1) {
         $noty .= sprintf($mlang_bin5_bin5['info_mult'][$G_lang], multoval($multer) );
     }
     $noty .= "<hr><br>";
+    if ($table->match_id != -1) {
+        $noty .= sprintf($mlang_bin5_bin5['info_match'][$G_lang], $table->match_id);
+        $noty .= "<hr><br>";
+    }
     $ret .= show_notify($noty, 3000, $mlang_bin5_bin5['btn_bkgame'][$G_lang], 500, 400);
-    /* NOTE: show_notify($noty, 3000, "torna alla partita", 500, 
-     *                   130 + ($table->points_n > 0 ? 50 : 0) + 
+    /* NOTE: show_notify($noty, 3000, "torna alla partita", 500,
+     *                   130 + ($table->points_n > 0 ? 50 : 0) +
      *                   (120 * ($table->points_n / MAX_POINTS)));
-     *       will be used when we refact notify js function following 
-     *       photoo class logic 
-     */ 
-  
+     *       will be used when we refact notify js function following
+     *       photoo class logic
+     */
+
     return ($ret);
 }
 
@@ -1748,9 +1920,9 @@ function briscola_show($bri, $table, $user)
     $ptnadd = "";
     $ret = "";
 
-    if ($table->asta_card == 9) 
+    if ($table->asta_card == 9)
         $ptnadd = sprintf($mlang_bin5_bin5['call_wptn'][$G_lang], $table->asta_pnt);
-  
+
     /* text of caller cell */
     if ($user->table_pos == $table->asta_win) {
         $prestr = sprintf('$("callerinfo").innerHTML = "%s";', $mlang_bin5_bin5['call_ycall'][$G_lang]);
@@ -1758,7 +1930,7 @@ function briscola_show($bri, $table, $user)
     }
     else {
         $prestr = sprintf('$("callerinfo").innerHTML = "%s";', $mlang_bin5_bin5['call_call'][$G_lang]);
-        $ret .= sprintf($prestr, 
+        $ret .= sprintf($prestr,
                         xcape($bri->user[$table->player[$table->asta_win]]->name), $ptnadd);
     }
     $ret .= sprintf('set_iscalling(%d);', ($table->asta_win - $user->table_pos + BIN5_PLAYERS_N) % BIN5_PLAYERS_N);
@@ -1771,7 +1943,7 @@ function briscola_show($bri, $table, $user)
     $ret .= sprintf('$("astalascio").style.visibility = "";');
     $ret .= sprintf('$("asta").style.visibility = "hidden";');
     $ret .= sprintf('show_astat(-2,-2,-2,-2,-2);');
-  
+
     return ($ret);
 }
 
@@ -1794,7 +1966,7 @@ function game_result($asta_pnt, $pnt)
     }
 }
 
-function log_points($remote_addr, $curtime, $user, $where, $mesg) 
+function log_points($remote_addr, $curtime, $user, $where, $mesg)
 {
     if (($fp = @fopen(LEGAL_PATH."/points.log", 'a')) != FALSE) {
         /* Unix time | session | nickname | IP | where was | mesg */
@@ -1805,4 +1977,111 @@ 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%1$s', $tg_br, $tg_hr);
+
+    return ($noty);
+}
+
 ?>
index 71cbca1..fd932b4 100644 (file)
@@ -96,13 +96,13 @@ function ptsgam_cmp($a, $b)
 }
 
 /* types of placing based on delta time */
-define(TY_DTIME_TRI, 0);
-define(TY_DTIME_MON, 1);
-define(TY_DTIME_WEE, 2);
+define('TY_DTIME_TRI', 0);
+define('TY_DTIME_MON', 1);
+define('TY_DTIME_WEE', 2);
 
 /* subtypes of placing based on number of played games */
-define(SUBTY_FREQ_LO, 0);
-define(SUBTY_FREQ_HI, 1);
+define('SUBTY_FREQ_LO', 0);
+define('SUBTY_FREQ_HI', 1);
 
 
 function placings_show($user) 
index 32545f7..2e8d76c 100644 (file)
@@ -210,7 +210,7 @@ function table_init() {
     show_astat(-2,-2,-2,-2,-2);
     set_iscalling(-1);
 
-    for (i=0 ; i < 8 ; i++) {
+    for (i=0 ; i < CARD_HAND ; i++) {
        Drag.init($("card" + i), card_mouseup_cb);
        for (e = 0 ; e < PLAYERS_N ; e++)
            $("card"+sux[e]+i).style.visibility = "hidden";
@@ -220,7 +220,7 @@ function table_init() {
        $("takes"+sux[i]).style.visibility = "hidden";
        }
 
-    for (i = 0 ; i < 8 ; i++) {
+    for (i=0 ; i < CARD_HAND ; i++) {
        cards_pos[i] = i;
        cards_ea_pos[i] = i;
        cards_ne_pos[i] = i;
index 1a5c6f5..76e4fab 100644 (file)
  * Suite 330, Boston, MA 02111-1307, USA.
  *
  */
-
+/* number of players */
 var PLAYERS_N = 3;
+/* initial number of cards in hand */
+var CARD_HAND = 3;
 /* current manche */
 var manche = 1;
 /* cards on hands */
@@ -65,16 +67,16 @@ var G_take_time = 500;
 /* suffix to add to images name */
 var sux = new Array( "", "_ea", "", "", "_we");
 
-var cards_pos = new Array (8);
-var cards_ea_pos = new Array (8);
-var cards_ne_pos = new Array (8);
-var cards_nw_pos = new Array (8);
-var cards_we_pos = new Array (8);
+var cards_pos = new Array (CARD_HAND);
+var cards_ea_pos = new Array (CARD_HAND);
+var cards_ne_pos = new Array (CARD_HAND);
+var cards_nw_pos = new Array (CARD_HAND);
+var cards_we_pos = new Array (CARD_HAND);
 
 var take_x = new Array(562, 745, 452, 30, 52);
 var take_y = new Array(545, 177,  70, 62,155);
 
-for (i = 0 ; i < 8 ; i++) {
+for (i = 0 ; i < CARD_HAND ; i++) {
     cards_pos[i] = i;
     cards_ea_pos[i] = i;
     cards_ne_pos[i] = i;
@@ -110,7 +112,7 @@ function cards_dispose_so(car_n, tak_n)
     for (i = 0 ; i < car_n ; i++) {
        $("card" + cards_pos[i]).style.left = start + (i * inter);
        $("card" + cards_pos[i]).style.top  = 475 + (125 - cards_height)/2;
-       $("card" + cards_pos[i]).style.zIndex = 8 - i;
+       $("card" + cards_pos[i]).style.zIndex = CARD_HAND - i;
        $("card" + cards_pos[i]).style.visibility = "visible";
     }
 
@@ -227,7 +229,7 @@ function cards_dispose_ea(car_n, tak_n) {
     for (i = 0 ; i < car_n ; i++) {
        $("card_ea" + cards_ea_pos[i]).style.left = 675 + (125 - cards_height)/2;
        $("card_ea" + cards_ea_pos[i]).style.top  = start + (i * inter);
-       $("card_ea" + cards_ea_pos[i]).style.zIndex = 8 - i;
+       $("card_ea" + cards_ea_pos[i]).style.zIndex = CARD_HAND - i;
        $("card_ea" + cards_ea_pos[i]).style.visibility = "visible";
        // alert("xx "+ (675 + (125 - cards_height)/2) +" yy " + start + (i * inter));
     }
@@ -273,7 +275,7 @@ function cards_dispose_we(car_n, tak_n)
     for (i = 0 ; i < car_n ; i++) {
        $("card_we" + cards_we_pos[i]).style.left = (125 - cards_height)/2;
        $("card_we" + cards_we_pos[i]).style.top  = start - (i * inter);
-       $("card_we" + cards_we_pos[i]).style.zIndex = 8 - i;
+       $("card_we" + cards_we_pos[i]).style.zIndex = CARD_HAND - i;
        $("card_we" + cards_we_pos[i]).style.visibility = "visible";
     }
        
@@ -510,7 +512,7 @@ function card_setours(zer,uno,due,tre,qua,cin,sei,set)
     var i;
     var arg = new Array(zer,uno,due,tre,qua,cin,sei,set);
 
-    for (i = 0 ; i < 8 ; i++) {
+    for (i = 0 ; i < CARD_HAND ; i++) {
        $("card"+i).src = getcard(arg[i], 0);
        $("card"+i).briskid = arg[i];
     }
index e1852ab..dd09f68 100644 (file)
@@ -40,11 +40,11 @@ require_once("Obj/briskin5.phh");
 require_once("Obj/placing.phh");
 
 function main() {
-
- if (file_exists(LEGAL_PATH."/explain.log")) {
-      $ret .= file_get_contents(LEGAL_PATH."/explain.log");
-  }
-  echo "$ret";
+    $ret = "";
   if (file_exists(LEGAL_PATH."/explain.log")) {
+        $ret .= file_get_contents(LEGAL_PATH."/explain.log");
+    }
+    echo "$ret";
 }
 ?>
 <html>
index 98fd79b..27e32d1 100644 (file)
@@ -1,9 +1,9 @@
 <?php
 /*
- *  brisk - index_wr.php
+ *  brisk - briskin5/index_wr.php
  *
  *  Copyright (C) 2006-2012 Matteo Nastasi
- *                          mailto: nastasi@alternativeoutput.it 
+ *                          mailto: nastasi@alternativeoutput.it
  *                                  matteo.nastasi@milug.org
  *                          web: http://www.alternativeoutput.it
  *
@@ -53,24 +53,24 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
     if ($bri == NULL) {
         return FALSE;
     }
-    
-    if (($mesg = gpcs_var('mesg', $get, $post, $cookie)) === FALSE) 
+
+    if (($mesg = gpcs_var('mesg', $get, $post, $cookie)) === FALSE)
         unset($mesg);
-    
-    if (($sess = gpcs_var('sess', $get, $post, $cookie)) === FALSE) 
+
+    if (($sess = gpcs_var('sess', $get, $post, $cookie)) === FALSE)
         $sess = "";
 
     log_wr('COMM: '.$mesg);
 
 
-    if (($CO_bin5_pref_ring_endauct = gpcs_var('CO_bin5_pref_ring_endauct', $get, $post, $cookie)) === FALSE) 
+    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 = &$bri->get_user($sess, &$idx)) == FALSE) {
         echo "Get User Error";
         log_wr("Get User Error");
@@ -83,18 +83,18 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
     }
 
     $argz = explode('|', $mesg);
-    
+
     log_wr('POSTSPLIT: '.$argz[0].'  user->stat: ['.$user->stat.']');
     log_wr($user->step, 'bin::index_wr.php: after get_user()');
 
     $user->lacc = $curtime;
-    
+
     if ($argz[0] == 'ping') {
         log_wr("PING RECEIVED");
     }
     else if (false && $argz[0] == 'shutdown') {
         log_auth($user_cur->sess, "Shutdown session. delegate to room gc the autologout");
-        
+
         log_rd2("bin5/index_wr.php: AUTO LOGOUT.");
         if ($user->stat == 'table') {
             $bri->table_wakeup($user);
@@ -112,7 +112,7 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
     else if ($user->stat == 'table') {
         $user->laccwr = time();
         $table = $bri->table[$user->table];
-        
+
         if ($argz[0] == 'tableinfo') {
             log_wr("PER DI TABLEINFO");
             $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
@@ -125,7 +125,7 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
         }
         else if ($argz[0] == 'preferences_update') {
             log_wr("PER DI PREFERENCES_UPDATE");
-            
+
             if ($CO_bin5_pref_ring_endauct == "true")
                 $user->privflags |= BIN5_USER_FLAG_RING_ENDAUCT;
             else
@@ -133,12 +133,12 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
         }
         else if ($argz[0] == 'logout') {
             $remcalc = $argz[1];
-            
+
             if ($user->exitislock == TRUE) {
                 $remcalc++;
                 $user->exitislock = FALSE;
             }
-            
+
             $logout_cont = TRUE;
             if ($remcalc >= 3) {
                 $lockcalc = $table->exitlock_calc(&$bri->user, $user->table_pos);
@@ -146,7 +146,7 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                     $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
                     $user->comm[$user->step % COMM_N] .= $table->exitlock_show(&$bri->user, $user->table_pos);
                     $user->comm[$user->step % COMM_N] .=  show_notify("<br>I dati presenti sul server non erano allineati con quelli inviati dal tuo browser, adesso lo sono. Riprova ora.", 2000, "torna alla partita.", 400, 100);
-                    
+
                     log_wr($user->comm[$user->step % COMM_N]);
                     $user->step_inc();
                     $logout_cont = FALSE;
@@ -158,7 +158,7 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                               $user->ip, $user->sess, $user->laccwr + BAN_TIME);
             }
             //      $user->bantime = $user->laccwr + BAN_TIME;
-            
+
             if ($logout_cont == TRUE) {
                 $bri->table_wakeup(&$user);
             }
@@ -166,14 +166,14 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
         else if ($argz[0] == 'exitlock') {
             if ($user->exitislock == TRUE) {
                 $user->exitislock = ($user->exitislock == TRUE ? FALSE : TRUE);
-                for ($ct = 0, $i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {   
+                for ($ct = 0, $i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                     $user_cur[$i] = &$bri->user[$table->player[$i]];
                     if ($user_cur[$i]->exitislock == FALSE)
                         $ct++;
                 }
                 for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                     $ret = sprintf('gst.st = %d;', $user_cur[$i]->step+1);
-                    $ret .= sprintf('exitlock_show(%d, %s);', $ct, 
+                    $ret .= sprintf('exitlock_show(%d, %s);', $ct,
                                     ($user_cur[$i]->exitislock ? 'true' : 'false'));
                     $user_cur[$i]->comm[$user_cur[$i]->step % COMM_N] = $ret;
                     log_wr($user_cur[$i]->comm[$user_cur[$i]->step % COMM_N]);
@@ -182,38 +182,55 @@ function bin5_index_wr_main(&$bri, $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();
-                $table->game_init(&$bri->user);
-                
-                for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {    
-                    $user_cur = &$bri->user[$table->player[$i]];
-                    
-                    $ret = sprintf('gst.st = %d;', $user_cur->step+1);
-                    $ret .= show_table(&$bri,&$user_cur,$user_cur->step+1, TRUE, TRUE);
-                    $user_cur->comm[$user_cur->step % COMM_N] = $ret;
-                    $user_cur->step_inc();         
+            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(&$bri->user); */
+
+                if ($table->rules_engine(&$bri, $curtime, BIN5_RULES_ABANDON, $user)) {
+                    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                        $user_cur = &$bri->user[$table->player[$i]];
+
+                        $ret = sprintf('gst.st = %d;', $user_cur->step+1);
+                        $ret .= show_table(&$bri,&$user_cur,$user_cur->step+1, TRUE, TRUE);
+                        $user_cur->comm[$user_cur->step % COMM_N] = $ret;
+                        $user_cur->step_inc();
+                    }
                 }
             }
             else if ($argz[0] == 'asta') {
                 $again = TRUE;
-                
+
                 $index_cur = $table->gstart % BIN5_PLAYERS_N;
                 if ($user->table_pos == $index_cur &&
                     $table->asta_pla[$index_cur]) {
                     $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.");
@@ -227,8 +244,8 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                             $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;
@@ -239,36 +256,34 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                             }
                         }
                     }
-                    
-      
-      
+
                     if ($again) { // Qualcosa non andato bene, rifare
-                        $ret = sprintf('gst.st = %d; asta_pnt_set(%d);', $user->step+1, 
+                        $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();
-                        
+
                         log_wr("Ripetere.");
                     }
                     else {
                         /* next step */
-                        $showst = "show_astat("; 
+                        $showst = "show_astat(";
                         for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                             $user_cur = &$bri->user[$table->player[$i]];
-                            $showst .= sprintf("%s%d", ($i == 0 ? "" : ", "), 
+                            $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 .= ");";
-                        
+
                         $maxcard = -2;
                         for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                             $user_cur = &$bri->user[$table->player[$i]];
                             if ($maxcard < $user_cur->asta_card)
                                 $maxcard = $user_cur->asta_card;
                         }
-                        
+
                         if (($table->asta_pla_n > ($maxcard > -1 ? 1 : 0)) &&
                             !($table->asta_card == 9 && $table->asta_pnt == 120)) {
                             log_wr("ALLOPPA QUI");
@@ -280,13 +295,13 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                                     break;
                                 }
                             }
-                            
-                            
+
+
                             for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                                 $user_cur = &$bri->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();', 
+                                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();',
@@ -297,22 +312,16 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                         }
                         else if ($table->asta_pla_n == 0) {
                             log_wr("PASSANO TUTTI!");
-                            
-                            log_wr(sprintf("GIOCO FINITO !!!"));
-                            
-                            $table->old_reason = "Hanno passato tutti.";
-                            $table->mult += 1; 
-                            
-                            $table->game_next();
-                            $table->game_init(&$bri->user);
-                            
-                            for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {        
-                                $user_cur = &$bri->user[$table->player[$i]];
-                                
-                                $ret = sprintf('gst.st = %d;', $user_cur->step+1);
-                                $ret .= show_table(&$bri,&$user_cur,$user_cur->step+1, TRUE, TRUE);
-                                $user_cur->comm[$user_cur->step % COMM_N] = $ret;
-                                $user_cur->step_inc();     
+
+                            if ($table->rules_engine(&$bri, $curtime, BIN5_RULES_ALLPASS, $user)) {
+                                for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                                    $user_cur = &$bri->user[$table->player[$i]];
+
+                                    $ret = sprintf('gst.st = %d;', $user_cur->step+1);
+                                    $ret .= show_table(&$bri,&$user_cur,$user_cur->step+1, TRUE, TRUE);
+                                    $user_cur->comm[$user_cur->step % COMM_N] = $ret;
+                                    $user_cur->step_inc();
+                                }
                             }
                         }
                         else {
@@ -320,13 +329,13 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                             // 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++) 
+                                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->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();
                                 */
@@ -338,21 +347,21 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                                 }
                             }
                             $table->asta_win = $chooser;
-                            
+
                             for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                                 $user_cur = &$bri->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));
-                                
+
                                 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();     
+                                $user_cur->step_inc();
                             }
                         }
                     }
@@ -363,7 +372,7 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
             }
             /*  asta::choose */
             else if ($argz[0] == 'choose') {
-                if ($table->asta_win > -1 && 
+                if ($table->asta_win > -1 &&
                     $user->table_pos == $table->asta_win) {
                     $a_brisco = $argz[1];
                     if ($a_brisco >= 0 && $a_brisco < 40) {
@@ -372,177 +381,145 @@ function bin5_index_wr_main(&$bri, $remote_addr_full, $get, $post, $cookie)
                         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 = &$bri->user[$table->player[$chooser]];
                         for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                             $user_cur = &$bri->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($bri, $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();         
+                            $user_cur->step_inc();
                         }
                         /*
                           TUTTE LE VARIABILI DI STATO PER PASSARE A GIOCARE E LE
                           VAR PER PASSARE ALLA FASE DI GIOCO
                         */
-                        
+
                     }
                 }
             }
         }
         else if ($user->subst == 'game') {
             log_wr("state: table::game".$argz[0]);
-            
+
             if ($argz[0] == 'play') {
                 $a_play = $argz[1];
                 $a_x =    $argz[2];
                 $a_y =    $argz[3];
-                
+
                 if (strpos($a_x, "px") != FALSE)
                     $a_x = substr($a_x,0,-2);
                 if (strpos($a_y, "px") != FALSE)
                     $a_y = substr($a_y,0,-2);
-                
+
                 $loggo = sprintf("A_play %s, table_pos %d == %d, mazzo %d, gstart %d, card_stat %d, card_own %d",
                                  $a_play, $user->table_pos, ($table->gstart % BIN5_PLAYERS_N),
                                  $table->mazzo, $table->gstart,
                                  $table->card[$a_play]->stat, $table->card[$a_play]->owner);
                 log_wr("CIC".$loggo);
-                
+
                 /* se era il suo turno e la carta era sua ed era in mano */
-                if ($a_play >=0 && $a_play < (BIN5_PLAYERS_N == 5 ? 40 : 24) &&
+                if ($a_play >=0 && $a_play < (BIN5_CARD_HAND * BIN5_PLAYERS_N) &&
                     ($user->table_pos == (($table->gstart + $table->turn) % BIN5_PLAYERS_N)) &&
                     $table->card[$a_play]->stat == 'hand' &&
                     $table->card[$a_play]->owner == $user->table_pos) {
                     log_wr(sprintf("User: %s Play: %d",$user->name, $a_play));
-                    
+
                     /* Change the card status. */
                     $table->card[$a_play]->play($a_x, $a_y);
-                    
+
                     /*
                      *  !!!! TURN INCREMENTED BEFORE !!!!
                      */
                     $turn_cur = ($table->gstart + $table->turn) % BIN5_PLAYERS_N;
                     $table->turn++;
-                    
+
                     $card_play = sprintf("card_play(%d,%d,%d,%d);|",
                                          $user->table_pos, $a_play, $a_x, $a_y);
                     if (($table->turn % BIN5_PLAYERS_N) != 0) {     /* manche not finished */
                         $turn_nex = ($table->gstart + $table->turn) % BIN5_PLAYERS_N;
-                        
+
                         $player_cur = "remark_off();";
                         $player_nex = $card_play . "is_my_time = true; remark_on();";
                         $player_oth = $card_play;
                     }
-                    else if ($table->turn <= (BIN5_PLAYERS_N * 8)) { /* manche finished */
+                    else if ($table->turn <= (BIN5_PLAYERS_N * BIN5_CARD_HAND)) { /* manche finished */
                         $winner = calculate_winner($table);
                         log_wr("GSTART 3");
                         $table->gstart = $winner;
                         $turn_nex = ($table->gstart + $table->turn) % BIN5_PLAYERS_N;
-                        
+
                         log_wr(sprintf("The winner is: [%d] [%s]", $winner, $bri->user[$table->player[$winner]]->name));
                         $card_take = sprintf("sleep(gst,2000);|cards_take(%d);|", $winner);
-                        $player_cur = "remark_off();" . $card_take; 
+                        $player_cur = "remark_off();" . $card_take;
                         if ($turn_cur != $turn_nex)
                             $player_nex = $card_play . $card_take;
                         else
                             $player_nex = "";
-                        if ($table->turn < (BIN5_PLAYERS_N * 8))  /* game NOT finished */
+                        if ($table->turn < (BIN5_PLAYERS_N * BIN5_CARD_HAND))  /* game NOT finished */
                             $player_nex .= "is_my_time = true; remark_on();";
                         $player_oth = $card_play . $card_take;
                     }
-                    
+
                     log_wr(sprintf("Turn Cur %d Turn Nex %d",$turn_cur, $turn_nex));
-                    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {        
+                    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                         $user_cur = &$bri->user[$table->player[$i]];
-                        
+
                         $ret = sprintf('gst.st = %d; ', $user_cur->step+1);
-                        
-                        
+
+
                         if ($i == $turn_cur) {
-                            $ret .= $player_cur;         
+                            $ret .= $player_cur;
                         }
                         if ($i == $turn_nex) {
-                            $ret .= $player_nex;         
+                            $ret .= $player_nex;
                         }
                         if ($i != $turn_cur && $i != $turn_nex) {
                             $ret .= $player_oth;
                         }
-                        
+
                         $retar[$i] = $ret;
                     }
-                    
-                    if ($table->turn == (BIN5_PLAYERS_N * 8)) { /* game finished */
+
+                    if ($table->turn == (BIN5_PLAYERS_N * BIN5_CARD_HAND)) { /* game finished */
                         log_wr(sprintf("GIOCO FINITO !!!"));
-                        
-                        
-                        /* ************************************************ */
-                        /*    PRIMA LA PARTE PER LO SHOW DI CHI HA VINTO    */
-                        /* ************************************************ */
-                        $pt_cur = calculate_points(&$table);
-                        
-                        $plist = "$table->table_token|$user->table_orig|$table->player_n";
-                        $ucodes = array();
-                        for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-                            $user_cur = &$bri->user[$table->player[$i]];
-                            $plist .= '|'.xcapelt($user_cur->name).'|'.$pt_cur[$i];
-                            $ucodes[$i] = $user_cur->code_get();
-                        }
-                        for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-                            $plist .= '|'.xcapelt($ucodes[$i]);
-                        }
-                        log_legal($curtime, $user->ip, $user, "STAT:BRISKIN5:FINISH_GAME", $plist);
-                        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->table_token, $user->table_orig, $ucodes, $pt_cur);
-                                unset($bdb);
-                            }
-                            else {
-                                log_points($remote_addr, $curtime, $user, "STAT:BRISKIN5:FINISH_GAME", "DATABASE CONNECTION FAILED");
+
+                        if ($table->rules_engine(&$bri, $curtime, BIN5_RULES_FINISH, $user)) {
+                            for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+                                $user_cur = &$bri->user[$table->player[$i]];
+                                $retar[$i] .= show_table(&$bri,&$user_cur,$user_cur->step+1,TRUE, TRUE);
                             }
-                            log_points($curtime, $user, "STAT:BRISKIN5:FINISH_GAME", $plist);
-                        }
-                        
-                        $table->game_next();
-                        $table->game_init(&$bri->user);
-                        
-                        for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
-                            $user_cur = &$bri->user[$table->player[$i]];
-                            $retar[$i] .= show_table(&$bri,&$user_cur,$user_cur->step+1,TRUE, TRUE);
                         }
                     }
-                    
-                    
-                    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {        
+
+                    for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                         $user_cur = &$bri->user[$table->player[$i]];
-                        
+
                         $user_cur->comm[$user_cur->step % COMM_N] = $retar[$i];
-                        $user_cur->step_inc();     
+                        $user_cur->step_inc();
                     }
-                    
+
                     log_wr(sprintf("TURN: %d",$table->turn));
                     /* Have played all the players ? */
                     /* NO:  switch the focus and enable the next player to play. */
-                    
+
                     /* YES: calculate who win and go to the next turn. */
                 }
             }
index 7218905..72408e4 100644 (file)
@@ -1,9 +1,9 @@
 <?php
 /*
- *  brisk - statadm.php
+ *  brisk - stat-day.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|
-   
+  call example:
+wget -O daily.txt dodo.birds.van/brisk/briskin5/stat-day.php?pazz=yourpasswd&from=1000&to=1380308086
+
+now="$(date +%s)"
+
+# from 100 days ago to 1 day after
+to="$(date +"%Y-%m-%d+%H:%M:%S" -d @$(echo "$(date +%s) + 86400" | bc))"
+from="$(date +"%Y-%m-%d+%H:%M:%S" -d @$(echo "$(date +%s) - 8640000" | bc))"
+# to="$(date +"%Y-%m-%d+%H:%M:%S" -d @$(echo "$now + 7200 " | bc))"
+# from="$(date +"%Y-%m-%d+%H:%M:%S" -d @$(echo "$now - 9200 " | bc))"
+
+curl -d "pazz=$BRISK_PASS" "http://$BRISK_SITE/briskin5/stat-day.php?from=$(date +"%Y-%m-%d+%H:%M:%S" -d @$(echo "$(date +%s) - 8640000" | bc))&to=$(date +"%Y-%m-%d+%H:%M:%S" -d @$(echo "$(date +%s) + 86400" | bc))"
+
 */
 
 $G_base = "../";
 
+$mlang_stat_day = array( 'normal match'=> array( 'it' => 'Partite normali',
+                                                 'en' => 'Normal matches' ),
+                         'special match' => array( 'it' => 'Partite speciali',
+                                                   'en' => 'Special matches'),
+
+                         'info_total'=> array( 'it' => 'totali',
+                                               'en' => 'En totali')
+                         );
+
+
 ini_set("max_execution_time",  "240");
 
 require_once("../Obj/brisk.phh");
@@ -41,17 +61,17 @@ require_once("Obj/placing.phh");
 
 function main_file($curtime)
 {
-  GLOBAL $G_alarm_passwd;
+    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)
@@ -63,7 +83,7 @@ function main_file($curtime)
     echo "database connection failed";
     exit;
   }
-      
+
   $bdb->users_load();
 
   for ($i = 0 ; $i < $bdb->count() ; $i++) {
@@ -82,7 +102,7 @@ function main_file($curtime)
     // if not auth table, continue
     if (count($ar) < 15)
       continue;
-    
+
     // echo $p++."<br>";
     if ($ar[7] >= TABLES_AUTH_N)
       continue;
@@ -98,11 +118,11 @@ function main_file($curtime)
         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++) {
@@ -125,22 +145,22 @@ function main_file($curtime)
         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) 
+      if ($ar[0] >= $curtime - MON_LIMIT)
         $mon[$id]->add($ar[10+($i*2)] / $mult);
-      if ($ar[0] >= $curtime - WEE_LIMIT) 
+      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) {
@@ -156,9 +176,9 @@ function main_file($curtime)
     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) 
+    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) 
+    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);
@@ -179,9 +199,9 @@ function main_file($curtime)
     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) 
+    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) 
+    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);
@@ -198,12 +218,12 @@ function main_file($curtime)
   }
 
   for ($i = 0 ; $i < count($wee) ; $i++) {
-    if ($wee[$i]->gam == 0.0) 
+    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) 
+    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) 
+    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);
@@ -213,60 +233,96 @@ function main_file($curtime)
 
 function main_pgsql($from, $to)
 {
-    GLOBAL $G_dbpfx;
+    GLOBAL $G_lang, $G_dbpfx, $mlang_stat_day;
 
-  if (($fpexp = @fopen(LEGAL_PATH."/explain.log", 'w')) == FALSE) {
-    echo "Open explain failed<br>";
-    exit;
-  }
-    fprintf($fpexp, "<h2>Minuta delle partite dal (%s) al (%s)</h2>",
-       $from, $to);
+    $ret = FALSE;
+    $fpexp = FALSE;
 
-    if (($bdb = BriskDB::create()) == FALSE) {
-        echo "database connection failed";
-        exit;
-    }
     do {
+        if (($fpexp = @fopen(LEGAL_PATH."/explain.log", 'w')) == FALSE) {
+            log_crit("stat-day: open explain failed");
+            break;
+        }
+        fprintf($fpexp, "<h2>Minuta delle partite dal (%s) al (%s)</h2>",
+                $from, $to);
+
+        if (($bdb = BriskDB::create()) == FALSE) {
+            log_crit("stat-day: database connection failed");
+            break;
+        }
+
         if (pg_query($bdb->dbconn->db(), "BEGIN") == FALSE) {
-            log_crit("statadm: begin failed");
+            log_crit("stat-day: begin failed");
             break;
         }
-        
-        $tmt_sql = sprintf("select m.code as code from %sbin5_matches as m, %sbin5_games as g WHERE m.code = g.mcode AND g.tstamp >= '%s' AND g.tstamp < '%s' GROUP BY m.code;", $G_dbpfx, $G_dbpfx, $from, $to);
 
-        // if deletable old matches exists then ...
-        if (($tmt_pg = pg_query($bdb->dbconn->db(), $tmt_sql)) != FALSE) {
+        // retrieve list of active tournaments
+        $trn_sql = sprintf("SELECT * FROM %sbin5_tournaments WHERE active = 1;", $G_dbpfx);
+        if (($trn_pg = pg_query($bdb->dbconn->db(), $trn_sql)) == FALSE) {
+            log_crit("stat-day: select from tournaments failed");
+            break;
+        }
+
+        $trn_n = pg_numrows($trn_pg);
+        printf("Number of tournaments: %d\n", $trn_n);
+
+        for ($t = 0 ; $t < $trn_n ; $t++) {
+            $trn_obj = pg_fetch_object($trn_pg, $t);
+
+            $tmt_sql = sprintf("SELECT m.code AS code, m.mazzo_next as minus_one_is_old FROM %sbin5_matches AS m, %sbin5_games AS g, %sbin5_tournaments as t WHERE t.code = m.tcode AND m.code = g.mcode AND t.code = %d AND g.tstamp >= '%s' AND g.tstamp < '%s' GROUP BY m.code, minus_one_is_old ORDER BY m.code, minus_one_is_old DESC;",
+                               $G_dbpfx, $G_dbpfx, $G_dbpfx, $trn_obj->code, $from, $to);
+
+            // if deletable old matches exists then ...
+            if (($tmt_pg = pg_query($bdb->dbconn->db(), $tmt_sql)) == FALSE) {
+                log_crit("stat-day: select from matches failed");
+                break;
+            }
+
             //
             // store matches before clean them
             //
             $tmt_n = pg_numrows($tmt_pg);
             // get matches
+            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]);
+
             for ($m = 0 ; $m < $tmt_n ; $m++) {
                 fprintf($fpexp, "<br>");
                 $tmt_obj = pg_fetch_object($tmt_pg, $m);
-                
-                $usr_sql = sprintf("
-SELECT u.code AS code, u.login AS login, min(g.tstamp) AS first, max(g.tstamp) AS last, m.tidx AS tidx FROM %sbin5_matches AS m, %sbin5_games AS g, %sbin5_points AS p, %susers AS u WHERE m.code = g.mcode AND g.code = p.gcode AND u.code = p.ucode AND m.code = %d GROUP BY u.code, u.login, m.tidx;", $G_dbpfx, $G_dbpfx, $G_dbpfx, $G_dbpfx, $tmt_obj->code);
-                
-               if (($usr_pg  = pg_query($bdb->dbconn->db(), $usr_sql)) == FALSE ) {
+
+                if (($users = $bdb->users_get($tmt_obj->code, TRUE, ($tmt_obj->minus_one_is_old > -1))) == FALSE) {
+                    log_crit("%s: users_get failed", __FUNCTION__);
                     break;
                 }
-                $usr_n = pg_numrows($usr_pg);
-                if ($usr_n != 5) {
+
+                $gam_sql = sprintf("SELECT g.* FROM %sbin5_tournaments as t, %sbin5_matches AS m, %sbin5_games AS g WHERE t.code = m.tcode AND m.code = g.mcode AND m.code = %d ORDER BY g.tstamp;",
+                                   $G_dbpfx, $G_dbpfx, $G_dbpfx, $tmt_obj->code);
+                if (($gam_pg = pg_query($bdb->dbconn->db(), $gam_sql)) == FALSE ) {
+                    log_crit("stat-day: gam_sql failed");
                     break;
-               }
-                for ($u = 0 ; $u < $usr_n ; $u++) {
-                    $usr_obj = pg_fetch_object($usr_pg, $u);
+                }
+
+                for ($u = 0 ; $u < count($users) ; $u++) {
                     if ($u == 0) {
-                        fprintf($fpexp, "<h3>Codice: %d (%s - %s), Tavolo: %s</h3>\n", $tmt_obj->code, $usr_obj->first, $usr_obj->last, $usr_obj->tidx);
+                        fprintf($fpexp, "<h3>Codice: %d (%s - %s), Tavolo: %s</h3>\n", $tmt_obj->code, $users[$u]['first'], $users[$u]['last'], $users[$u]['tidx']);
                         fprintf($fpexp, "<table align='center' class='placing'><tr>\n");
-                        }
-                    fprintf($fpexp, "<th>%s</th>", $usr_obj->login);
-                    $pts_sql = sprintf("
-select p.pts as pts from %sbin5_matches as m, %sbin5_games as g, %sbin5_points as p, %susers as u WHERE m.code = g.mcode AND g.code = p.gcode AND u.code = p.ucode AND m.code = %d AND u.code = %d ORDER BY g.code", $G_dbpfx, $G_dbpfx, $G_dbpfx, $G_dbpfx,
-                                   $tmt_obj->code, $usr_obj->code);
+                    }
+                    fprintf($fpexp, "<th>%s</th>", $users[$u]['login']);
+                    // note: we are looping on users, order on them not needed
+                    $pts_sql = sprintf("SELECT p.pts as pts from %sbin5_games as g, %sbin5_points as p WHERE g.code = p.gcode AND g.mcode = %d AND p.ucode = %d ORDER BY g.code",
+                                       $G_dbpfx, $G_dbpfx, $G_dbpfx,
+                                       $tmt_obj->code, $users[$u]['code']);
 
-                    if (($pts_pg[$u]  = pg_query($bdb->dbconn->db(), $pts_sql)) == FALSE) {
+                    // points of the match for each user
+                    if (($pts_pg[$u] = pg_query($bdb->dbconn->db(), $pts_sql)) == FALSE) {
+                        log_crit("stat-day: pts_sql failed");
                         break;
                     }
                     if ($u == 0) {
@@ -274,74 +330,95 @@ select p.pts as pts from %sbin5_matches as m, %sbin5_games as g, %sbin5_points a
                     }
                     else {
                         if ($num_games != pg_numrows($pts_pg[$u])) {
+                            log_crit("stat-day: num_games != pg_numrows");
                             break;
                         }
                     }
                 }
-                if ($u != 5) {
+                if ($u != BIN5_PLAYERS_N) {
+                    log_crit("stat-day: u != BIN5_PLAYERS_N");
                     break;
-                } 
-                fprintf($fpexp, "</tr>\n");
+                }
 
+                if ($tmt_obj->minus_one_is_old != -1) {
+                    fprintf($fpexp, "<th>mazzo</th><th>descrizione</th></tr>\n");
+                }
                 // LISTA DELLE VARIE PARTITE
                 for ($g = 0 ; $g < $num_games ; $g++) {
+                    $gam_obj = pg_fetch_object($gam_pg, $g);
                     fprintf($fpexp, "<tr>");
-                    for ($u = 0 ; $u < 5 ; $u++) {
+                    for ($u = 0 ; $u < BIN5_PLAYERS_N ; $u++) {
                         $pts_obj = pg_fetch_object($pts_pg[$u], $g);
-                        fprintf($fpexp, "<td>%d</td>", $pts_obj->pts);
+                        fprintf($fpexp, "<%s>%d</%s>",
+                                ($tmt_obj->minus_one_is_old == -1 ? "td" : "th"),
+                                $pts_obj->pts,
+                                ($tmt_obj->minus_one_is_old == -1 ? "td" : "th"));
+                    }
+                    if ($tmt_obj->minus_one_is_old != -1) {
+                        fprintf($fpexp, "<td>%s</td><td>%s</td>", $users[$gam_obj->mazzo]['login'],
+                                xcape( game_description($gam_obj->act, 'plain', $gam_obj->mult,
+                                                        $gam_obj->asta_win, $users[$gam_obj->asta_win]['login'],
+                                                        $gam_obj->friend, $users[$gam_obj->friend]['login'],
+                                                        $gam_obj->pnt, $gam_obj->asta_pnt) )
+                                );
                     }
                     fprintf($fpexp, "</tr>\n");
                 }
 
                 // LISTA DEI TOTALI
                 fprintf($fpexp, "<tr>");
-                for ($u = 0 ; $u < 5 ; $u++) {
-                    $usr_obj = pg_fetch_object($usr_pg, $u);
+                for ($u = 0 ; $u < BIN5_PLAYERS_N ; $u++) {
                     $tot_sql = sprintf("
 SELECT SUM(p.pts) AS pts FROM %sbin5_matches AS m, %sbin5_games AS g, %sbin5_points AS p, %susers AS u WHERE m.code = g.mcode AND g.code = p.gcode AND u.code = p.ucode AND m.code = %d AND u.code = %d", $G_dbpfx, $G_dbpfx, $G_dbpfx, $G_dbpfx,
-                                   $tmt_obj->code, $usr_obj->code);
+                                       $tmt_obj->code, $users[$u]['code']);
                     if (($tot_pg  = pg_query($bdb->dbconn->db(), $tot_sql)) == FALSE ) {
                         break;
                     }
                     $tot_obj = pg_fetch_object($tot_pg, 0);
                     fprintf($fpexp, "<th>%d</th>", $tot_obj->pts);
                 }
-                fprintf($fpexp, "</tr>\n");
+                if ($tmt_obj->minus_one_is_old != -1) {
+                    fprintf($fpexp, "<th colspan='2'>%s</th></tr>\n", $mlang_stat_day['info_total'][$G_lang]);
+                }
                 fprintf($fpexp, "</table>\n");
             }
             if ($m < $tmt_n)
                 break;
-        } // if (($tmt_pg = pg_query($bdb->dbco...
-
-        fclose($fpexp);
-        return (TRUE);
+        }
+        if ($t < $trn_n)
+            break;
+        $ret = (TRUE);
     } while (0);
 
-    pg_query($bdb->dbconn->db(), "ROLLBACK");
-    fclose($fpexp);
+    if ($ret == FALSE) {
+        pg_query($bdb->dbconn->db(), "ROLLBACK");
+    }
+    if ($fpexp != FALSE) {
+        fclose($fpexp);
+    }
 
-    return (FALSE);
+    return ($ret);
 }
 
 // echo "QUIr\n";
 // exit(123);
 function main()
 {
-    GLOBAL $G_dbasetype, $G_alarm_passwd, $pazz, $from, $to;
-    
+    GLOBAL $G_lang, $G_dbasetype, $G_alarm_passwd, $pazz, $from, $to;
+
     if ($pazz != $G_alarm_passwd) {
         echo "Wrong password<br>";
         mop_flush();
         exit;
     }
-    
+
     $fun_name = "main_${G_dbasetype}";
-    
+
     if ($ret = $fun_name($from, $to))
         echo "Success.<br>\n";
     else
         echo "Failed.<br>\n";
-    
+
     echo "Fine.\n";
     mop_flush();
 }
index db3cf9b..f6d40b3 100644 (file)
@@ -30,6 +30,8 @@
 
 $G_base = "../";
 
+define('BIN5_TOURNAMENT_NORMAL', 1);
+
 ini_set("max_execution_time",  "240");
 
 require_once("../Obj/brisk.phh");
@@ -232,8 +234,8 @@ function main_pgsql($curtime)
         
         $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 g.mcode = m.code GROUP BY m.code, m.ttok",
-                           $G_dbpfx, $G_dbpfx, $G_dbpfx);
+                            WHERE m.tcode = %d AND m.code = g.mcode GROUP BY m.code, m.ttok",
+                           $G_dbpfx, $G_dbpfx, $G_dbpfx, BIN5_TOURNAMENT_NORMAL);
         if (pg_query($bdb->dbconn->db(), $mtc_sql) == FALSE) {
             log_crit("statadm: temporary matches table creation [$mtc_sql] failed");
             break;
@@ -336,12 +338,14 @@ function main_pgsql($curtime)
             
             $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 p.ucode = u.code AND p.gcode = g.code AND g.mcode = m.code AND 
-                                      g.tstamp > to_timestamp(%d) AND g.tstamp <= to_timestamp(%d)
+                                WHERE m.tcode = %d AND m.code = g.mcode AND
+                                      g.tstamp > to_timestamp(%d) AND g.tstamp <= to_timestamp(%d) AND
+                                      p.ucode = u.code AND p.gcode = g.code
                                 GROUP BY u.code, u.login
                                 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, $curtime - $limi[$dtime], $curtime);
+                               $G_dbpfx, $G_dbpfx, $G_dbpfx, $G_dbpfx, BIN5_TOURNAMENT_NORMAL,
+                               $curtime - $limi[$dtime], $curtime);
 
             // log_crit("statadm: INFO: [$pla_sql]");
 
index 3021613..192094d 100644 (file)
@@ -25,7 +25,7 @@ var PLAYERS_N = 3;
 var EXIT_BAN_TIME = 3600;
 var cookiepath = "/brisk/";
 
-var mlang_commons = { 'imgload_a' : { 'it' : 'Immagine caricate ', 
+var mlang_commons = { 'imgload_a' : { 'it' : 'Immagini caricate ',
                                       'en' : 'Loaded images ' },
                       'imgload_b' : { 'it' : '%.', 
                                       'en' : '%.' },
index cf1abd8..c11a22d 100644 (file)
@@ -185,6 +185,10 @@ $mlang_room = array( 'userpasserr'  => array('it' => 'Utente e/o password errati
                                              'en' => 'user\'s placings'),
                      'itm_cla'      => array('it' => 'classifiche',
                                              'en' => 'placings'),
+                     'tit_mnu'      => array('it' => 'minuta giornaliera',
+                                             'en' => 'daily report'),
+                     'itm_mnu'      => array('it' => 'minuta',
+                                             'en' => 'daily deport'),
                      'tit_rmap'     => array('it' => 'prossime funzionalità implementate',
                                              'en' => 'roadmap of next functionalities'),
                      'itm_rmap'     => array('it' => 'roadmap',
@@ -612,6 +616,10 @@ google_color_url = "000000";
    onmouseover="menu_hide(0,1);"
    title="'.$mlang_room['tit_cla'][$G_lang].'" onclick="act_placing();">'.$mlang_room['itm_cla'][$G_lang].'</a><br>
 
+<a target="_blank" href="briskin5/explain.php"
+   onmouseover="menu_hide(0,1);"
+   title="'.$mlang_room['tit_mnu'][$G_lang].'">'.$mlang_room['itm_mnu'][$G_lang].'</a><br>
+
 <a href="#"
    onmouseover="menu_hide(0,1);"
    title="'.$mlang_room['tit_rmap'][$G_lang].'" onclick="act_roadmap();">'.$mlang_room['itm_rmap'][$G_lang].'</a><br>
index 91eb8f3..a9d8906 100644 (file)
@@ -667,10 +667,7 @@ function index_wr_main(&$room, $remote_addr_full, $get, $post, $cookie)
                         $bri_user_cur = $bri->user[$i];
                         $user_cur = $room->user[$table->player[$i]];
                         
-                        $bri_user_cur->stat_set('table');
-                        $bri_user_cur->subst = 'asta';
                         $bri_user_cur->laccwr = $curtime;
-                        
                         $bri_user_cur->trans_step = $user_cur->step + 1;
                         $bri_user_cur->comm[$bri_user_cur->step % COMM_N] = "";
                         $bri_user_cur->step_inc();
@@ -685,11 +682,8 @@ function index_wr_main(&$room, $remote_addr_full, $get, $post, $cookie)
                         //         // CHECK
                         while (array_pop($user_cur->comm) != NULL);
           
-                        $ret = "";
-                        $ret .= sprintf('gst.st_loc++; gst.st=%d; createCookie("table_idx", %d, 24*365, cookiepath); createCookie("table_token", "%s", 24*365, cookiepath); createCookie("lang", "%s", 24*365, cookiepath); xstm.stop(); window.onunload = null ; window.onbeforeunload = null ; document.location.assign("briskin5/index.php");|', $user_cur->step+1, $table_idx, $table_token, $G_lang);
-                        
-                        $user_cur->comm[$user_cur->step % COMM_N] = $ret;
                         $user_cur->trans_step = $user_cur->step + 1;
+                        $user_cur->comm[$user_cur->step % COMM_N] = sprintf('gst.st_loc++; gst.st=%d; createCookie("table_idx", %d, 24*365, cookiepath); createCookie("table_token", "%s", 24*365, cookiepath); createCookie("lang", "%s", 24*365, cookiepath); xstm.stop(); window.onunload = null ; window.onbeforeunload = null ; document.location.assign("briskin5/index.php");|', $user_cur->step+1, $table_idx, $table_token, $G_lang);
                         log_wr("TRANS ATTIVATO");
                         
                         $user_cur->stat_set('table');
index 507490f..7292340 100644 (file)
@@ -869,6 +869,7 @@ xynt_streaming.prototype = {
                //xx this.hbit("+");
 
                 // alert("SINGLE: ["+singlecomm+"]");
+                // window.console.log("["+singlecomm+"]");
                this.cmdproc(singlecomm);
                again = 1;
            }
index 7cafda6..01adb53 100644 (file)
@@ -5,7 +5,8 @@ $desc = array( "Semplice: da 1 a 9 ogni secondo, poi ricomincia (status sempre v
                "Restart: da 1 a 8 ogni secondo, pausa 16 secondi (status passa ad arancione e poi a rosso), poi ricomincia (e status torna a verde).",
                "Pausa: da 1 a 5 ogni secondo, pausa 3 secondi, e poi 8 e 9 ogni secondo, e poi ricomincia (status sempre verde).",
                "Keyword: da 1 a 5 ogni secondo, @BEGIN@, @END@, @BEGIN@ xxx yyy @END@, 9, (status sempre verde).",
-               "Reload limiter: da 1 a 8 ogni secondo e chiude, 9 setta e chiude subito,<br>il client aspetta 3 secondi, e poi da 10 a N ogni secondo, (status sempre verde).");
+               "Reload limiter: da 1 a 8 ogni secondo e chiude, 9 setta e chiude subito,<br>il client aspetta 3 secondi, e poi da 10 a N ogni secondo, (status sempre verde).",
+               "Esegue un comando, manda loc_new a un valore irraggiungibile, stoppa il processore di comandi e poi dà un comando teoricamente irraggiungibile.");
 
 
 // trim(mb_convert_case($split[0], MB_CASE_TITLE, 'UTF-8'))
@@ -252,6 +253,17 @@ if (isset($isstream) && $isstream == "true") {
                     sleep(1);
             }
         }
+        break;
+    case 7:
+        $chunk = $trobj->chunk(1, sprintf("gst.st++; \$('container').innerHTML = 'prima';"));
+        print($chunk);
+
+        $chunk = $trobj->chunk(2, sprintf("gst.st++; gst.st_loc_new++; xstm.stop();"));
+        print($chunk);
+
+        $chunk = $trobj->chunk(3, sprintf("gst.st++; \$('container').innerHTML = 'dopo';"));
+        print($chunk);
+
         break;
     }