new placement points management done
authorMatteo Nastasi (mop) <nastasi@alternativeoutput.it>
Tue, 25 Feb 2014 17:34:58 +0000 (18:34 +0100)
committerMatteo Nastasi (mop) <nastasi@alternativeoutput.it>
Tue, 25 Feb 2014 17:34:58 +0000 (18:34 +0100)
doc/ARCHITECTURE.txt
web/Obj/dbase_pgsql.phh
web/briskin5/Obj/briskin5.phh
web/briskin5/stat-day.php

index d074067..da2fc8f 100644 (file)
@@ -2,6 +2,16 @@ Sparse documentation about Brisk.
 
 ==== brisk/table/user relationships ====
 
+=== points management ===
+
+read from db:
+  * continue a match
+  * calculate placings
+  * calculate explain
+
+write to db:
+  * finish a game
+
 === in the room ===
 
 // when standup
index 05a42f7..9a0baa3 100644 (file)
@@ -414,7 +414,8 @@ class BriskDB
         $num_obj = pg_fetch_object($num_pg, 0);
         $table->points_n = $num_obj->points_n;
 
-        $tot_sql = sprintf("SELECT sum(p.pts) AS pts
+        // TAG: POINTS_MANAGEMENT
+        $tot_sql = sprintf("SELECT sum(p.pts * (2^g.mult)) 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
@@ -430,7 +431,8 @@ class BriskDB
 
         $u = 0;
         foreach ($users as $user) {
-            $pts_sql = sprintf("SELECT p.pts AS pts
+            // TAG: POINTS_MANAGEMENT
+            $pts_sql = sprintf("SELECT p.pts AS pts, g.mult AS mult
                                     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
@@ -450,9 +452,10 @@ class BriskDB
                 log_crit(sprintf("%s::%s: number of points great than number of games", __CLASS__, __FUNCTION__));
                 return (FALSE);
             }
+            // TAG: POINTS_MANAGEMENT
             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;
+                $table->points[$ct % MAX_POINTS][$u] = $pts_obj->pts * pow(2, $pts_obj->mult);
             }
             $tot_obj = pg_fetch_object($tot_pg, $u);
             $table->total[$u] = $tot_obj->pts;
index f51b303..eaa3096 100644 (file)
@@ -339,11 +339,9 @@ class Bin5_table extends Table {
     function multer($is_new)
     {
         if ($is_new) {
-            // 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 (static::s_multer($this->old_mult, $this->old_asta_pnt));
         }
     }
@@ -353,6 +351,11 @@ class Bin5_table extends Table {
         return (pow(2, $mult) * static::asta2mult($pnt));
     }
 
+    static function s_point_calc($pnt_done, $mult, $pnt_req, $is_allpoints)
+    {
+        return ($pnt_done * static::s_multer($mult, $pnt_req) * ($is_allpoints ? 2 : 1));
+    }
+
     //   function bunch_create_old() function AND
     //   {
     //     $ret = array();
@@ -509,7 +512,7 @@ class Bin5_table extends Table {
     {
         GLOBAL $G_all_points, $G_dbasetype;
 
-        $pts = array();
+        $pnts_sav = array();
 
         $this->old_act = $action;
         if ($action == BIN5_RULES_ALLPASS) { // return TRUE if all correct
@@ -517,7 +520,7 @@ class Bin5_table extends Table {
             $this->old_pnt = 0;
             $this->mult_inc(1);
             for ($i = 0 ; $i < PLAYERS_N ; $i++) {
-                $pts[$i] = 0;
+                $pnts_sav[$i] = 0;
             }
 
             $game_delta = 1;
@@ -531,7 +534,7 @@ class Bin5_table extends Table {
             $this->mult_inc(1);
 
             for ($i = 0 ; $i < PLAYERS_N ; $i++) {
-                $pts[$i] = 0;
+                $pnts_sav[$i] = 0;
             }
 
             // Non si cambia mazzo se si abbandona la partita
@@ -563,13 +566,12 @@ class Bin5_table extends Table {
                     $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;
+                        $pnts_sav[$i] = 0;
                     }
                     $this->points_n++;
                     $this->old_pnt = $pro;
                     $this->mult_inc(1);
 
-                    // return($pts);
                     break;
                 }
 
@@ -578,31 +580,29 @@ class Bin5_table extends Table {
                 else
                     $sig = -1;
 
+                // TAG: POINTS_MANAGEMENT
                 $this->points[$this->points_n % MAX_POINTS] = array();
                 for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
                     if ($i == $this->asta_win)
-                        $pt = ($i == $this->friend ? 4 : 2);
+                        $pnt = ($i == $this->friend ? 4 : 2);
                     else if ($i == $this->friend)
-                        $pt = 1;
+                        $pnt = 1;
                     else
-                        $pt = -1;
+                        $pnt = -1;
 
-                    log_wr(sprintf("PRO: pt[%d][%d] = %d", $this->points_n % MAX_POINTS, $i, $pt));
+                    log_wr(sprintf("PRO: pt[%d][%d] = %d", $this->points_n % MAX_POINTS, $i, $pnt));
 
-                    $pt = $pt * $sig * $this->multer(TRUE) * ($pro == 120 ? 2 : 1);
+                    $pnt_sav = static::s_point_calc($pnt * $sig,           0, $this->asta_pnt, ($pro == 120));
+                    $pnt_tab = static::s_point_calc($pnt * $sig, $this->mult, $this->asta_pnt, ($pro == 120));
 
-                    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[$this->points_n % MAX_POINTS][$i] = $pnt_tab;
+                    $this->total[$i] += $pnt_tab;
+                    $pnts_sav[$i] = $pnt_sav;
                 }
                 $this->points_n++;
                 $this->old_pnt = $pro;
                 $this->old_asta_win = $this->asta_win;
                 $this->mult_set(0);
-
-                // return($pts);
             } while (0);
             $game_delta = 1;
         }
@@ -621,7 +621,7 @@ class Bin5_table extends Table {
             $ucodes[$i] = $user_cur->code_get();
 
             /* pro log */
-            $plist .= '|'.xcapelt($user_cur->name).'|'.$pts[$i];
+            $plist .= '|'.xcapelt($user_cur->name).'|'.$pnts_sav[$i];
             $codes .= '|'.xcapelt($user_cur->code_get());
         }
         $plist .= $codes;
@@ -646,7 +646,7 @@ class Bin5_table extends Table {
             require_once("../Obj/dbase_".$G_dbasetype.".phh");
 
             if (($bdb = BriskDB::create()) != FALSE) {
-                $bdb->bin5_points_save($curtime, $this, $user->table_orig, $action, $ucodes, $pts);
+                $bdb->bin5_points_save($curtime, $this, $user->table_orig, $action, $ucodes, $pnts_sav);
                 unset($bdb);
             }
             else {
@@ -1841,6 +1841,7 @@ function show_table_info(&$bri, &$table, $table_pos)
     $ret = "";
     $user = $bri->user[$table->player[$table_pos]];
 
+    // TAG: POINTS_MANAGEMENT
     $pnt_min = $table->points_n - MAX_POINTS < 0 ? 0 : $table->points_n - MAX_POINTS;
     $noty = sprintf('<table class=\"points\"><tr><th></th>');
 
index c8af36d..11289cc 100644 (file)
@@ -405,7 +405,7 @@ function main_pgsql($from, $to)
 
                         fprintf($fpexp, "<%s class='%s'>%d</%s>",
                                 ($tmt_obj->minus_one_is_old == -1 ? "td" : "th"),
-                                $cla_nam, $pts,
+                                $cla_nam, pow(2,$gam_obj->mult) * $pts,
                                 ($tmt_obj->minus_one_is_old == -1 ? "td" : "th"));
                     }
                     if ($tmt_obj->minus_one_is_old != -1) {
@@ -426,9 +426,15 @@ function main_pgsql($from, $to)
                 // LISTA DEI TOTALI
                 fprintf($fpexp, "<tr>");
                 for ($u = 0 ; $u < BIN5_PLAYERS_N ; $u++) {
+                    // NOTE: this part must be revisited when we move to multiple game rules
+                    //       probably removing the sum and adding another nested iteration on games.
                     $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 ( (u.type & (CAST (X'00ff0000' as integer))) <> (CAST (X'00800000' as integer)) ) AND m.code = %d AND u.code = %d", $G_dbpfx, $G_dbpfx, $G_dbpfx, $G_dbpfx,
+SELECT sum(p.pts * (2^g.mult)) 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 ( (u.type & (CAST (X'00ff0000' as integer))) <> (CAST (X'00800000' as integer)) )
+        AND m.code = %d AND u.code = %d",
+                                       $G_dbpfx, $G_dbpfx, $G_dbpfx, $G_dbpfx,
                                        $tmt_obj->code, $users[$u]['code']);
                     if (($tot_pg  = pg_query($bdb->dbconn->db(), $tot_sql)) == FALSE ) {
                         break;
@@ -463,8 +469,6 @@ WHERE m.code = g.mcode AND g.code = p.gcode AND u.code = p.ucode AND ( (u.type &
     return ($ret);
 }
 
-// echo "QUIr\n";
-// exit(123);
 function main()
 {
     GLOBAL $G_lang, $G_dbasetype, $G_alarm_passwd, $pazz, $from, $to;