+ function hand_points($idx)
+ {
+ GLOBAL $G_all_points;
+
+ $tot = 0;
+
+ for ($i = 0 ; $i < (BIN5_CARD_HAND * BIN5_PLAYERS_N) ; $i++) {
+ // for ($i = 0 ; $i < 40 ; $i++) {
+ if ($this->card[$i]->owner != $idx)
+ continue;
+
+ $ctt = $this->card[$i]->value % 10;
+ $tot += $G_all_points[$ctt];
+ }
+
+ return ($tot);
+ }
+
+
+ function exitlock_show($userarr, $table_pos)
+ {
+ $ct = $this->exitlock_calc($userarr, $table_pos);
+
+ $ret = sprintf('exitlock_show(%d, %s);', $ct,
+ ($userarr[$this->player[$table_pos]]->exitislock ? 'true' : 'false'));
+ return ($ret);
+ }
+
+ function exitlock_calc(&$userarr, $table_pos)
+ {
+ $ct = 0;
+
+ for ($i = 0 , $ct = 0 ; $i < PLAYERS_N ; $i++) {
+ if ($userarr[$this->player[$i]]->exitislock == FALSE)
+ $ct++;
+ }
+
+ return ($ct);
+ }
+
+ function rules_engine($bri, $action, $user)
+ {
+ GLOBAL $G_all_points;
+
+ $pts = array();
+
+ if ($action == BIN5_RULES_ALLPASS) { // return TRUE if all correct
+ $this->old_reason = "Hanno passato tutti.";
+ $this->old_pnt = 0;
+ $this->mult += 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_reason = sprintf("Ha lasciato %s perché aveva al massimo 2 punti.", xcape($user->name));
+ $this->old_pnt = 0;
+ $this->mult += 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 += 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->mult = 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_mazzo = $this->mazzo;
+ $this->old_asta_pnt = $this->asta_pnt;
+ $this->old_mult = $this->mult;
+ // $this->old_pnt and $this->old_reason are specific
+ $this->old_asta_win = $this->asta_win;
+ $this->old_friend = $this->friend;
+
+ 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, $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);