+ 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, $curtime, $action, $user)
+ {
+ GLOBAL $G_all_points, $G_dbasetype;
+
+ $pnts_sav = 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++) {
+ $pnts_sav[$i] = 0;
+ }
+
+ $game_delta = 1;
+ // $this->game_next(1);
+ $this->game_init(&$bri->user);
+ }
+ else if ($action == BIN5_RULES_ABANDON) { // return TRUE if all correct
+ log_wr(sprintf("GIOCO FINITO !!!"));
+ $this->old_asta_win = $user->table_pos;
+ $this->old_pnt = 0;
+ $this->mult_inc(1);
+
+ for ($i = 0 ; $i < PLAYERS_N ; $i++) {
+ $pnts_sav[$i] = 0;
+ }
+
+ // Non si cambia mazzo se si abbandona la partita
+ $game_delta = 0;
+ // $this->game_next(0);
+ $this->game_init(&$bri->user);
+ }
+ else if ($action == BIN5_RULES_FINISH) { // return TRUE if all correct
+ 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;
+ $pnts_sav[$i] = 0;
+ }
+ $this->points_n++;
+ $this->old_pnt = $pro;
+ $this->mult_inc(1);
+
+ break;
+ }
+
+ if ($pro >= $this->asta_pnt)
+ $sig = 1;
+ else
+ $sig = -1;
+
+ // TAG: POINTS_MANAGEMENT
+ $this->points[$this->points_n % MAX_POINTS] = array();
+ for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+ if ($i == $this->asta_win)
+ $pnt = ($i == $this->friend ? 4 : 2);
+ else if ($i == $this->friend)
+ $pnt = 1;
+ else
+ $pnt = -1;
+
+ log_wr(sprintf("PRO: pt[%d][%d] = %d", $this->points_n % MAX_POINTS, $i, $pnt));
+
+ $pnt_sav = static::s_point_calc($pnt * $sig, 0, $this->asta_pnt, ($pro == 120));
+ $pnt_tab = static::s_point_calc($pnt * $sig, $this->mult, $this->asta_pnt, ($pro == 120));
+
+ $this->points[$this->points_n % MAX_POINTS][$i] = $pnt_tab;
+ $this->total[$i] += $pnt_tab;
+ $pnts_sav[$i] = $pnt_sav;
+ }
+ $this->points_n++;
+ $this->old_pnt = $pro;
+ $this->old_asta_win = $this->asta_win;
+ $this->mult_set(0);
+ } while (0);
+ $game_delta = 1;
+ }
+ else {
+ return (FALSE);
+ }
+ $this->game_next($game_delta);
+
+ $plist = "$this->table_token|$user->table_orig|$this->player_n";
+ $ucodes = array();
+ $codes = "";
+ for ($i = 0 ; $i < BIN5_PLAYERS_N ; $i++) {
+ $user_cur = &$bri->user[$this->player[$i]];
+
+ /* pro db */
+ $ucodes[$i] = $user_cur->code_get();
+
+ /* pro log */
+ $plist .= '|'.xcapelt($user_cur->name).'|'.$pnts_sav[$i];
+ $codes .= '|'.xcapelt($user_cur->code_get());
+ }
+ $plist .= $codes;
+ log_legal($curtime, $user->ip, $user, "STAT:BRISKIN5:FINISH_GAME", $plist);
+
+ $this->old_asta_pnt = $this->asta_pnt;
+ // $this->old_mazzo is managed by ->game_next();
+ // $this->old_mult, $this->old_pnt, $this->old_reason and $this->old_asta_win are specific
+
+ $this->old_friend = $this->friend;
+ $this->old_reason = game_description($action, 'html', $this->old_mult,
+ $this->old_asta_win,
+ ($this->old_asta_win != -1 ?
+ $bri->user[$this->player[$this->old_asta_win]]->name : ""),
+ $this->old_friend,
+ ($this->old_friend != -1 ?
+ $bri->user[$this->player[$this->old_friend]]->name : ""),
+ $this->old_pnt, $this->old_asta_pnt);
+
+
+ if ($user->table_orig < TABLES_AUTH_N) {
+ require_once("../Obj/dbase_".$G_dbasetype.".phh");
+
+ if (($bdb = BriskDB::create()) != FALSE) {
+ $bdb->bin5_points_save($curtime, $this, $user->table_orig, $action, $ucodes, $pnts_sav);
+ unset($bdb);
+ }
+ else {
+ log_points($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);