\n".
"
\n";
}
else if($trick==$lasttrick)
{
/* start of a last trick? */
echo "
Trick $trickNR\n".
" \n".
"
\n";
};
/* remember first card, so that we are able to check, what cards can be played */
$firstcard = $r[0];
};
/* display card */
echo "
\n";
/* display comments */
if($comment!='')
echo " \n";
echo ' ';
display_card($r[0],$PREF['cardset']);
echo "
\n"; /* end div card */
/* end of trick? */
if($seq==4)
{
$winner = get_winner($play,$gametype); /* returns the position */
echo "
\n \n"; /* end div trick, end li trick */
}
}
/* whos turn is it? */
if($seq==4)
{
$winner = get_winner($play,$gametype); /* returns the position */
$next = $winner;
$firstcard = ''; /* new trick, no first card */
}
else
{
$next = $pos+1;
if($next==5) $next = 1;
}
/* my turn?, display cards as links, ask for comments*/
if(DB_get_pos_by_hash($me) == $next)
$myturn = 1;
else
$myturn = 0;
/* do we want to play a card? */
if(myisset('card') && $myturn)
{
$card = $_REQUEST['card'];
$handid = DB_get_handid('hash',$me);
$commentSchweinchen =''; /* used to add a comment when Schweinchen is being played */
/* check if we have card and that we haven't played it yet*/
/* set played in hand_card to true where hand_id and card_id*/
$r = DB_query_array("SELECT id FROM Hand_Card WHERE played='false' and ".
"hand_id='$handid' AND card_id=".DB_quote_smart($card));
$handcardid = $r[0];
if($handcardid) /* everything ok, play card */
{
/* update Game timestamp */
DB_update_game_timestamp($gameid);
/* mark card as played */
DB_query("UPDATE Hand_Card SET played='true' WHERE hand_id='$handid' AND card_id=".
DB_quote_smart($card));
/* get trick id or start new trick */
$a = DB_get_current_trickid($gameid);
$trickid = $a[0];
$sequence = $a[1];
$tricknr = $a[2];
$playid = DB_play_card($trickid,$handcardid,$sequence);
/* check special output for schweinchen in case in case a fox is being played
* check for correct rules, etc. has already been done
*/
if( $GAME['schweinchen-who'] && ($card == 19 || $card == 20) )
{
if(!$GAME['schweinchen-first'])
$GAME['schweinchen-first'] = 1; /* playing the first fox */
else
$GAME['schweinchen-second'] = 1; /* this must be the second fox */
if( $RULES['schweinchen']=='both' ||
($RULES['schweinchen']=='second' && $GAME['schweinchen-second']==1 )||
($RULES['schweinchen']=='secondaftercall' && $GAME['schweinchen-second']==1 &&
(DB_get_call_by_hash($GAME['schweinchen-who']) || DB_get_partner_call_by_hash($GAME['schweinchen-who']) ))
)
{
DB_insert_comment('Schweinchen! ',$playid,$myid);
$commentSchweinchen = 'Schweinchen! ';
}
if ($debug)
echo 'schweinchen = '.$GAME['schweinchen-who'].' ---
';
}
/* if sequence == 4 check who one in case of wedding */
if($sequence == 4 && $GT == 'wedding')
{
/* is wedding resolve */
$resolved = DB_get_sickness_by_gameid($gameid);
if($resolved<0)
{
/* who has wedding */
$userids = DB_get_all_userid_by_gameid($gameid);
foreach($userids as $user)
{
$usersick = DB_get_sickness_by_userid_and_gameid($user,$gameid);
if($usersick == 'wedding')
$whosick = $user;
}
/* who won the trick */
$play = DB_get_cards_by_trick($trickid);
$winner = get_winner($play,$gametype); /* returns the position */
$winnerid = DB_get_userid('gameid-position',$gameid,$winner);
/* is tricknr <=3 */
if($tricknr <=3 && $winnerid!=$whosick)
{
/* set resolved at tricknr*/
$resolved = DB_set_sickness_by_gameid($gameid,$tricknr);
/* set partner */
$whash = DB_get_hash_from_gameid_and_userid($gameid,$winnerid);
DB_set_party_by_hash($whash,'re');
}
if($tricknr == 3 && $winnerid==$whosick)
{
/* set resolved at tricknr*/
$resolved = DB_set_sickness_by_gameid($gameid,'3');
}
}
}
/* if sequence == 4, set winner of the trick, count points and set the next player */
if($sequence==4)
{
$play = DB_get_cards_by_trick($trickid);
$winner = get_winner($play,$gametype); /* returns the position */
/*
* check if someone caught a fox
*******************************/
/* first check if we should account for solos at all,
* since it doesn't make sense in some games
*/
$ok = 0; /* fox shouldn't be counted */
if(DB_get_gametype_by_gameid($gameid)=='solo')
{
$solo = DB_get_solo_by_gameid($gameid);
if($solo == 'trump' || $solo == 'silent')
$ok = 1; /* for trump solos and silent solos, foxes are ok */
}
else
$ok = 1; /* for all other games (not solos) foxes are ok too */
if($ok==1)
foreach($play as $played)
{
if ( $played['card']==19 || $played['card']==20 )
if ($played['pos']!= $winner )
{
/* possible caught a fox, check party */
$uid1 = DB_get_userid('gameid-position',$gameid,$winner);
$uid2 = DB_get_userid('gameid-position',$gameid,$played['pos']);
$party1 = DB_get_party_by_gameid_and_userid($gameid,$uid1);
$party2 = DB_get_party_by_gameid_and_userid($gameid,$uid2);
if($party1 != $party2)
DB_query("INSERT INTO Score".
" VALUES( NULL,NULL,$gameid,'$party1',$uid1,$uid2,'fox')");
}
}
/*
* check for karlchen (jack of clubs in the last trick)
******************************************************/
/* same as for foxes, karlchen doesn't always make sense
* check what kind of game it is and set karlchen accordingly */
$ok = 1; /* default: karlchen should be accounted for */
if($tricknr != 12 )
$ok = 0; /* Karlchen works only in the last trick */
if($ok && DB_get_gametype_by_gameid($gameid)=='solo' )
{
$solo = DB_get_solo_by_gameid($gameid);
if($solo == 'trumpless' || $solo == 'jack' || $solo == 'queen' )
$ok = 0; /* no Karlchen in these solos */
}
if($ok)
foreach($play as $played)
if ( $played['card']==11 || $played['card']==12 )
if ($played['pos'] == $winner )
{
/* possible caught a fox, check party */
$uid1 = DB_get_userid('gameid-position',$gameid,$winner);
$party1 = DB_get_party_by_gameid_and_userid($gameid,$uid1);
DB_query("INSERT INTO Score".
" VALUES( NULL,NULL,$gameid,'$party1',$uid1,NULL,'karlchen')");
}
/*
* check for doppelopf (>40 points)
***********************************/
$points = 0;
foreach($play as $played)
{
$points += DB_get_card_value_by_cardid($played['card']);
}
if($points > 39)
{
$uid1 = DB_get_userid('gameid-position',$gameid,$winner);
$party1 = DB_get_party_by_gameid_and_userid($gameid,$uid1);
DB_query("INSERT INTO Score".
" VALUES( NULL,NULL,$gameid,'$party1',$uid1,NULL,'doko')");
}
/*
* set winner (for this trick)
*/
if($winner>0)
DB_query("UPDATE Trick SET winner='$winner' WHERE id='$trickid'");
else
echo "ERROR during scoring";
if($debug)
echo "DEBUG: position $winner won the trick
";
/* who is the next player? */
$next = $winner;
}
else
{
$next = DB_get_pos_by_hash($me)+1;
}
if($next==5) $next=1;
/* check for coment */
if(myisset('comment'))
{
$comment = $_REQUEST['comment'];
if($comment != '')
DB_insert_comment($comment,$playid,$myid);
if($commentSchweinchen)
$comment = $commentSchweinchen . $comment;
};
/* display played card */
$pos = DB_get_pos_by_hash($me);
if($sequence==1)
{
echo "
Trick ".($tricknr)."\n".
" \n".
"
\n";
}
echo "
\n ";
/* display comments */
display_card($card,$PREF['cardset']);
if($comment!='')
echo "\n \n";
echo "
\n";
echo "
\n \n"; /* end div trick, end li trick */
/*check if we still have cards left, else set status to gameover */
if(sizeof(DB_get_hand($me))==0)
{
DB_set_hand_status_by_hash($me,'gameover');
$mystatus = 'gameover';
}
/* if all players are done, set game status to game over,
* get the points of the last trick and send out an email
* to all players
*/
$userids = DB_get_all_userid_by_gameid($gameid);
$done=1;
foreach($userids as $user)
if(DB_get_hand_status_by_userid_and_gameid($user,$gameid)!='gameover')
$done=0;
if($done)
DB_set_game_status_by_gameid($gameid,'gameover');
/* email next player, if game is still running */
if(DB_get_game_status_by_gameid($gameid)=='play')
{
$next_hash = DB_get_hash_from_game_and_pos($gameid,$next);
$who = DB_get_userid('hash',$next_hash);
DB_set_player_by_gameid($gameid,$who);
$message = "A card has been played in game ".DB_format_gameid($gameid).".\n\n".
"It's your turn now.\n".
"Use this link to play a card: ".$HOST.$INDEX."?action=game&me=".$next_hash."\n\n" ;
if( DB_get_email_pref_by_uid($who)!='emailaddict' )
{
$subject = 'A card has been played in game '.DB_format_gameid($gameid);
mymail($who,$subject,$message);
}
}
else /* send out final email */
{
/* individual score */
$result = DB_query("SELECT User.fullname, IFNULL(SUM(Card.points),0), Hand.party FROM Hand".
" LEFT JOIN Trick ON Trick.winner=Hand.position AND Trick.game_id=Hand.game_id".
" LEFT JOIN User ON User.id=Hand.user_id".
" LEFT JOIN Play ON Trick.id=Play.trick_id".
" LEFT JOIN Hand_Card ON Hand_Card.id=Play.hand_card_id".
" LEFT JOIN Card ON Card.id=Hand_Card.card_id".
" WHERE Hand.game_id='$gameid'".
" GROUP BY User.fullname" );
$message = "The game is over. Thanks for playing :)\n";
$message .= "Final score:\n";
while( $r = DB_fetch_array($result) )
$message .= " ".$r[0]."(".$r[2].") ".$r[1]."\n";
$result = DB_query("SELECT Hand.party, IFNULL(SUM(Card.points),0) FROM Hand".
" LEFT JOIN Trick ON Trick.winner=Hand.position AND Trick.game_id=Hand.game_id".
" LEFT JOIN User ON User.id=Hand.user_id".
" LEFT JOIN Play ON Trick.id=Play.trick_id".
" LEFT JOIN Hand_Card ON Hand_Card.id=Play.hand_card_id".
" LEFT JOIN Card ON Card.id=Hand_Card.card_id".
" WHERE Hand.game_id='$gameid'".
" GROUP BY Hand.party" );
$message .= "\nTotals:\n";
$re = 0;
$contra = 0;
while( $r = DB_fetch_array($result) )
{
$message .= " ".$r[0]." ".$r[1]."\n";
if($r[0] == 're')
$re = $r[1];
else if($r[0] == 'contra')
$contra = $r[1];
}
/*
* save score in database
*
*/
/* get calls from re/contra */
$call_re = NULL;
$call_contra = NULL;
foreach($userids as $user)
{
$hash = DB_get_hash_from_gameid_and_userid($gameid,$user);
$call = DB_get_call_by_hash($hash);
$party = DB_get_party_by_hash($hash);
if($call!=NULL)
{
$call = (int) $call;
if($party=='re')
{
if($call_re==NULL)
$call_re = $call;
else if( $call < $call_re)
$call_re = $call;
}
else if($party=='contra')
{
if($call_contra==NULL)
$call_contra = $call;
else if( $call < $call_contra)
$call_contra = $call;
}
}
}
/* figure out who one */
$winning_party = NULL;
if($call_re == NULL && $call_contra==NULL)
{
/* nobody made a call, so it's easy to figure out who won */
if($re>120)
$winning_party='re';
else
$winning_party='contra';
}
else
{
/* if one party makes a call, they only win, iff they make enough points
* if only one party made a call, the other one wins,
* if the first one didn't make it
*/
if($call_re)
{
$offset = 120 - $call_re;
if($call_re == 0)
$offset--; /* since we use a > in the next equation */
if($re > 120+$offset)
$winning_party='re';
else if ($call_contra == NULL )
$winning_party='contra';
}
if($call_contra)
{
$offset = 120 - $call_contra;
if($call_contra == 0)
$offset--; /* since we use a > in the next equation */
if($contra > 120+$offset)
$winning_party='contra';
else if ($call_re == NULL )
$winning_party='re';
}
}
/* one point for each call of the other party in case the other party didn't win
* and one point each in case the party made more than points than one of the calls
*/
if($winning_party!='contra' && $call_contra!=NULL)
{
for( $p=$call_contra;$p<=120; $p+=30 )
{
DB_query("INSERT INTO Score".
" VALUES( NULL,NULL,$gameid,'re',NULL,NULL,'against$p')");
}
for( $p=$call_contra; $p<120; $p+=30)
{
if( $re >= $p )
DB_query("INSERT INTO Score".
" VALUES( NULL,NULL,$gameid,'re',NULL,NULL,'made$p')");
}
}
if($winning_party!='re' and $call_re!=NULL)
{
for( $p=$call_re;$p<=120; $p+=30 )
{
DB_query("INSERT INTO Score".
" VALUES( NULL,NULL,$gameid,'contra',NULL,NULL,'against$p')");
}
for( $p=$call_re; $p<120; $p+=30)
{
if( $contra>=$p )
DB_query("INSERT INTO Score".
" VALUES( NULL,NULL,$gameid,'contra',NULL,NULL,'made$p')");
}
}
/* point in case contra won */
if($winning_party=='contra')
{
DB_query("INSERT INTO Score".
" VALUES( NULL,NULL,$gameid,'contra',NULL,NULL,'againstqueens')");
}
/* one point each for winning and each 30 points + calls */
if($winning_party=='re')
{
foreach(array(120,150,180,210,240) as $p)
{
$offset = 0;
if($p==240 || $call_contra!=NULL)
$offset = 1;
if($re>$p-$offset)
DB_query("INSERT INTO Score".
" VALUES( NULL,NULL,$gameid,'re',NULL,NULL,'".(240-$p)."')");
}
/* re called something and won */
foreach(array(0,30,60,90,120) as $p)
{
if($call_re!=NULL && $call_re<$p+1)
DB_query("INSERT INTO Score".
" VALUES( NULL,NULL,$gameid,'re',NULL,NULL,'call$p')");
}
}
else if( $winning_party=='contra')
{
foreach(array(120,150,180,210,240) as $p)
{
$offset = 0;
if($p==240 || $call_re!=NULL)
$offset = 1;
if($contra>$p-$offset)
DB_query("INSERT INTO Score".
" VALUES( NULL,NULL,$gameid,'contra',NULL,NULL,'".(240-$p)."')");
}
/* re called something and won */
foreach(array(0,30,60,90,120) as $p)
{
if($call_contra!=NULL && $call_contra<$p+1)
DB_query("INSERT INTO Score".
" VALUES( NULL,NULL,$gameid,'contra',NULL,NULL,'call$p')");
}
}
/* add score points to email */
$message .= "\n";
$Tpoint = 0;
$message .= " Points Re: \n";
$queryresult = DB_query("SELECT score FROM Score ".
" WHERE game_id=$gameid AND party='re'".
" ");
while($r = DB_fetch_array($queryresult) )
{
$message .= " ".$r[0]."\n";
$Tpoint ++;
}
$message .= " Points Contra: \n";
$queryresult = DB_query("SELECT score FROM Score ".
" WHERE game_id=$gameid AND party='contra'".
" ");
while($r = DB_fetch_array($queryresult) )
{
$message .= " ".$r[0]."\n";
$Tpoint --;
}
$message .= " Total Points (from the Re point of view): $Tpoint\n";
$message .= "\n";
$session = DB_get_session_by_gameid($gameid);
$score = generate_score_table($session);
$message .= "Score Table:\n";
$message .= format_score_table_ascii($score);
$message .= "\nUse these links to have a look at game ".DB_format_gameid($gameid).": \n";
/* send out final email */
foreach($userids as $user)
{
/* add links for all players */
$hash = DB_get_hash_from_gameid_and_userid($gameid,$user);
$name = DB_get_name('userid',$user);
$link = "$name: ".$HOST.$INDEX."?action=game&me=".$hash."\n" ;
$message .= $link;
}
$message .= "\n\n (you can use reply all on this email to reach all the players.)\n\n";
$subject = ' Game over (game '.DB_format_gameid($gameid).') ';
mymail($userids,$subject,$message);
}
}
else
{
echo "can't find that card?!
\n";
}
}
else if(myisset('card') && !$myturn )
{
echo "please wait until it's your turn!
\n";
}
if($seq!=4 && $trickNR>=1 && !(myisset('card') && $myturn) )
echo "
\n