+/*
+ * brisk - briskin5.phh
+ *
+ * Copyright (C) 2006-2011 Matteo Nastasi
+ * mailto: nastasi@alternativeoutput.it
+ * matteo.nastasi@milug.org
+ * web: http://www.alternativeoutput.it
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details. You should have received a
+ * copy of the GNU General Public License along with this program; if
+ * not, write to the Free Software Foundation, Inc, 59 Temple Place -
+ * Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+define(BIN5_PLAYERS_N, 3);
+define(BIN5_MAX_PLAYERS, BIN5_PLAYERS_N);
+// define(BIN5_SHM_MIN, (50000 * BIN5_MAX_PLAYERS));
+define(BIN5_SHM_MIN, 32768);
+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ù 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 è 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>.' ),
+
+ '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.',
+ 'en' => 'it\'s the <b>%s</b>\'s turn.'),
+ 'info_mult' => array( 'it' => ' La partita vale <b>%s</b>.',
+ '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, '),
+ 'btn_bkgame'=> array( 'it' => 'torna alla partita',
+ 'en' => 'back to the game'),
+ 'call_wptn' => array( 'it' => '<br>con %d punti',
+ 'en' => '<br>with %d points'),
+ 'call_ycall'=> array( 'it' => 'Chiami%s:',
+ 'en' => 'Call%s:'),
+ 'call_call' => array( 'it' => 'Chiama %s%s:',
+ 'en' => 'The declarer is %s%s:')
+
+
+ );
+
+ // MLANG
+ $table_wellarr = Array( 'it' => Array ( 'Benvenuto al tavolo. Se almeno tre giocatori non sbloccano l\'uscita cliccando il lucchetto, chi esce non può risedersi a un qualunque tavolo per '.floor(BAN_TIME/60).' minuti.'),
+ 'en' => Array ( 'EN Benvenuto al tavolo. Se almeno tre giocatori non sbloccano l\'uscita cliccando il lucchetto, chi esce non può risedersi a un qualunque tavolo per '.floor(BAN_TIME/60).' minuti.') );
+
+function multoval($mult)
+{
+ GLOBAL $G_lang;
+
+ if ($mult == 2)
+ return ($G_lang == 'en' ? 'double' : 'doppio');
+ if ($mult == 3)
+ return ($G_lang == 'en' ? 'triple' : 'triplo');
+ else if ($mult == 4)
+ return ($G_lang == 'en' ? 'quadruple' : 'quadruplo');
+ else
+ return (sprintf(($G_lang == 'en' ? "%d-ple" : "%d-plo"), $mult));
+}
+
+
+class Card {
+ var $value; /* 0 - 39 card value */
+ var $stat; /* 'bunch', 'hand', 'table', 'take' */
+ var $owner; /* (table position 0-4) */
+ // var $pos; /* Pos in hand. */
+ var $x; /* When played the X position on the table of the owner. */
+ var $y; /* When played the Y position on the table of the owner. */
+
+ function Card($value, $stat, $owner)
+ {
+ $this->value = $value;
+ $this->stat = $stat; // Card stat
+ $this->owner = $owner;
+ }
+
+ function assign($stat,$owner)
+ {
+ $this->stat = $stat; // Card stat
+ $this->owner = $owner;
+ }
+
+ function setpos($pos)
+ {
+ $this->pos = $pos;
+ }
+
+ function play($x,$y)
+ {
+ $this->stat = 'table'; // Card stat
+ $this->x = $x;
+ $this->y = $y;
+ }
+
+ function take($newown)
+ {
+ $this->stat = 'take'; // Card stat
+ $this->owner = $newown;
+ }
+} // end class Card
+
+class Bin5_table extends Table {
+ var $card; // il mazzo di carte
+ var $mazzo; // chi e' di mazzo
+ var $gstart;
+ var $turn;
+
+ var $asta_pla;
+ 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 $briscola;
+ var $friend;
+
+ var $old_reason;
+ var $old_asta_pnt;
+ var $old_mult;
+ var $old_pnt;
+ var $old_win;
+ var $old_friend;
+
+ function Bin5_table()
+ {
+ }
+
+
+ /* CREATE() NOT USED
+ function create($idx)
+ {
+ if (($thiz =& new Bin5_table()) == FALSE)
+ return (FALSE);
+
+ $thiz->create($idx);
+
+ $thiz->card = FALSE;
+ $thiz->asta_pla = array(); // TRUE: in auction, FALSE: out of the auction
+ $thiz->asta_pla_n= -1;
+ $thiz->asta_card = -1;
+ $thiz->asta_pnt = -1;
+ $thiz->mult = 1;
+
+ $thiz->points = array( );
+ $thiz->points_n = 0;
+ $thiz->total = array( 0, 0, 0, 0, 0);
+ $thiz->asta_win = -1;
+ $thiz->briscola = -1;
+ $thiz->friend = -1;
+ $thiz->turn = 0;
+
+ $thiz->old_reason = "";
+ $thiz->old_asta_pnt = -1;
+ $thiz->old_mult = -1;
+ $thiz->old_pnt = -1;
+ $thiz->old_win = -1;
+ $thiz->old_friend = -1;
+
+ return ($thiz);
+ }
+ */
+
+ /* CLONE() NOT USED
+ function myclone(&$from)
+ {
+ 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->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;
+
+ return ($thiz);
+ }
+ */
+
+ function parentcopy(&$from)
+ {
+ parent::copy($from);
+ }
+
+ function spawn(&$from)
+ {
+ if (($thiz =& new Bin5_table()) == FALSE)
+ return (FALSE);
+
+ $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_n = 0;
+ $thiz->mult = 1;
+ $thiz->old_win = -1;
+ $thiz->old_reason = "";
+
+ // 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_win);
+
+ return ($thiz);
+ }
+
+
+ // 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++) {
+ // $ret[$i] =& new Card($i, 'bunch', 'no_owner');
+ // }
+ //
+ // $oret = &$ret;
+ // return ($oret);
+ // }
+
+ function bunch_create()
+ {
+ $ret = array();
+
+ for ($i = 0 ; $i < (BIN5_PLAYERS_N == 5 ? 40 : 24) ; $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_PLAYERS_N == 5 ? 40 : 24) - 1 ; $i >= 0 ; $i--)
+ $rest[$i] = $i;
+
+ for ($i = (BIN5_PLAYERS_N == 5 ? 40 : 24) - 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 = 1;
+ $this->old_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->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->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);
+ // SEE function calculate_points(&$table)
+ }
+ log_rd2("GEND 4");
+ }
+
+ function game_next()
+ {
+ $this->mazzo = ($this->mazzo + 1) % BIN5_PLAYERS_N;
+ }
+
+
+ function hand_points($idx)
+ {
+ GLOBAL $G_all_points;
+
+ $tot = 0;
+
+ for ($i = 0 ; $i < (BIN5_PLAYERS_N == 5 ? 40 : 24) ; $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);
+ }
+} // end class Bin5_table
+
+
+
+
+define(BIN5_USER_FLAG_RING_ENDAUCT, 0x01);
+
+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
+
+ 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;
+
+ 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;
+ }
+
+ /* CLONE NOT USED
+ function myclone(&$from)
+ {
+ if (($thiz =& new User()) == FALSE)
+ return (FALSE);
+
+ $thiz->copy($from);
+
+ return ($thiz);
+ }
+ */
+
+ function spawn($from, $table, $table_pos)
+ {
+ GLOBAL $CO_bin5_pref_ring_endauct;
+
+ if (($thiz = new Bin5_user()) == FALSE)
+ return (FALSE);
+
+ $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->idx = $table_pos;
+ $thiz->asta_card = -2;
+ $thiz->asta_pnt = -1;
+ $thiz->handpt = -1;
+ $thiz->exitislock = TRUE;
+
+ log_wr("Bin5 constructor");
+
+ $this->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);
+ }