+ $thiz->parentcopy($from);
+
+ log_main("PLAYER_N - spawn.".$thiz->player_n);
+
+ $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->match_id = -1;
+
+ $thiz->old_asta_win = -1;
+ $thiz->old_reason = "";
+
+ // FIXME
+ $rules_name = "Rules_old_rules";
+ $thiz->rules = new $rules_name($thiz);
+ // players are rearranged in an dedicated array
+ $thiz->player = array();
+ for ($i = 0 ; $i < $from->player_n ; $i++)
+ $thiz->player[$i] = $i;
+
+ log_main("TABLE_OLD_WIN - spawn:".$thiz->old_asta_win);
+
+ return ($thiz);
+ }
+
+
+ // function bunch_create_old() function AND
+ // {
+ // $ret = array();
+ //
+ // 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);
+ // }
+
+ function bunch_create()
+ {
+ $ret = array();
+
+ for ($i = 0 ; $i < (BIN5_CARD_HAND * BIN5_PLAYERS_N) ; $i++) {
+ $this->card[$i] = new Card($i, 'bunch', 'no_owner');
+ }
+ }
+
+ function bunch_make()
+ {
+ log_main("bunch_make start");
+ $ct = array(0,0,0,0,0);
+
+ mt_srand(make_seed());
+
+ for ($i = (BIN5_CARD_HAND * BIN5_PLAYERS_N) - 1 ; $i >= 0 ; $i--)
+ $rest[$i] = $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;
+ $this->card[$id]->assign('hand', $owner);
+
+ $rest[$rn] = $rest[$i];
+ // $pubbpos[$rn2] = $pubbpos[$i];
+ }
+ log_main("bunch_make end");
+ }
+
+ function init($userarr)
+ {
+ /* MOVED INTO SPAWN
+ $this->mazzo = rand(0,PLAYERS_N-1);
+ $this->points_n = 0;
+ $this->mult = 0;
+ $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;
+ }
+
+ log_main("table::init: ci siamo");
+ }
+
+ function game_init($userarr)
+ {
+ log_rd2("GSTART 4");
+
+ $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;
+ $this->asta_win = -1;
+ $this->briscola = -1;
+ $this->tourn_pts = -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]];
+ $user_cur->subst = 'asta';
+ $user_cur->asta_card = -2;
+ $user_cur->asta_pnt = -1;
+ $user_cur->handpt = $this->hand_points($i);
+ }
+ log_rd2("GEND 4");
+ }
+
+ function game_next($delta)
+ {
+ $this->old_mazzo = $this->mazzo;
+ $this->mazzo = ($this->mazzo + $delta) % BIN5_PLAYERS_N;
+ }
+
+ function mult_inc($val)
+ {
+ $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;
+
+ $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 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] .= nickserv_msg($dt, $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_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 $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)
+ return (FALSE);
+
+ if (($CO_bin5_pref_ring_endauct = gpcs_var("CO_bin5_pref_ring_endauct", $get, $post, $cookie)) === FALSE) {
+ $CO_bin5_pref_ring_endauct = "";
+ }
+
+ $thiz->parentcopy($from);
+
+ /* 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; // 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)
+ {
+ $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);
+ }
+
+ static function load_step($tab_id, $sess)
+ {
+ $fp = FALSE;
+ 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)
+ break;
+ if (($s = fread($fp, 8)) == FALSE)
+ break;
+ if (mb_strlen($s, "ASCII") != 8)
+ 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()
+ {
+ do {
+ if (validate_sess($this->sess) == FALSE)
+ break;
+ if (file_exists(BIN5_PROXY_PATH."/table".$this->table_orig) == FALSE)
+ mkdir(BIN5_PROXY_PATH."/table".$this->table_orig, 0775, TRUE);
+ if (($fp = @fopen(BIN5_PROXY_PATH."/table".$this->table_orig."/".$this->sess.".step", 'w')) == FALSE)
+ break;
+ fwrite($fp, pack("LL",$this->step, $this->idx));
+ fclose($fp);
+
+ 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");
+ if (file_exists(BIN5_PROXY_PATH."/table".$tab_id) == FALSE)
+ return;
+
+ @unlink(BIN5_PROXY_PATH."/table".$tab_id."/".$sess.".step");
+ }
+
+ 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;
+ }
+ if (shmop_delete($shm) == 0) {
+ log_crit("BIN5 USER DATA REMOVE FAILED 3");
+ break;
+ }
+ $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);
+ }
+
+ static function blocking_error($is_unrecoverable)
+ {
+ 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");
+ printf("xXx BIN5_USER::PAGE_SYNC\n");
+ return (sprintf('xstm.stop(); window.onbeforeunload = null; window.onunload = null; document.location.assign("%s");', $page));
+ }
+
+ protected function maincheck($get, $post, $cookie)
+ {
+ GLOBAL $G_lang;
+ GLOBAL $G_with_splash, $G_splash_content, $G_splash_interval, $G_splash_idx;
+ GLOBAL $G_splash_w, $G_splash_h, $G_splash_timeout;
+
+ GLOBAL $S_load_stat;
+
+ log_rd("maincheck begin");
+
+ $ret = FALSE;
+ $curtime = time();
+
+ /* Nothing changed, return. */
+ if ($this->rd_step == $this->step)
+ return (FALSE);
+
+ log_rd2("do other cur_stat[".$this->rd_stat."] user->stat[".$this->stat."] cur_step[".$this->rd_step."] user_step[".$this->step."]");
+
+ if ($this->rd_step == -1) {
+ /*
+ * if $this->rd_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);
+ $this->rd_step = $this->trans_step;
+ $this->trans_step = -1;
+ }
+ else {
+ log_rd2("TRANS NON ATTIVATO");
+ }