\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)
{
$trickNR++;
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);
/* check if a call was made, must do this before we set the card status to played */
if(myisset("call") && $_REQUEST["call"] == "120" && can_call(120,$me))
$result = DB_query("UPDATE Hand SET point_call='120' WHERE hash='$me' ");
if(myisset("call") && $_REQUEST["call"] == "90" && can_call(90,$me))
$result = DB_query("UPDATE Hand SET point_call='90' WHERE hash='$me' ");
if(myisset("call") && $_REQUEST["call"] == "60" && can_call(60,$me))
$result = DB_query("UPDATE Hand SET point_call='60' WHERE hash='$me' ");
if(myisset("call") && $_REQUEST["call"] == "30" && can_call(30,$me))
$result = DB_query("UPDATE Hand SET point_call='30' WHERE hash='$me' ");
if(myisset("call") && $_REQUEST["call"] == "0" && can_call(0,$me))
$result = DB_query("UPDATE Hand SET point_call='0' WHERE hash='$me' ");
/* 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( ($GAME['schweinchen-second']==1 && $RULES['schweinchen']=='second') || $RULES['schweinchen']=='both')
{
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')");
}
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;
};
/* check for note */
if(myisset("note"))
{
$note = $_REQUEST["note"];
if($note != "")
DB_insert_note($note,$gameid,$myid);
};
/* 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";
/*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);
$email = DB_get_email('hash',$next_hash);
$who = DB_get_userid('email',$email);
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" )
mymail($email,$EmailName."a card has been played in game ".DB_format_gameid($gameid),$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_re)
$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);
/* convert html to ascii */
$score = str_replace("
\n
\n \n","",$score);
$score = str_replace("
\n","",$score);
$score = str_replace("\n","",$score);
$score = str_replace(array("
"," ","
"," "),array("","\n","","|"),$score);
$score = explode("\n",$score);
$header = array_slice($score,0,1);
$header = explode("|",$header[0]);
for($i=0;$i
5) $header.= " ... \n";
if(sizeof($score)>5) $score = array_slice($score,-5,5);
for($i=0;$i \n";
}
}
else if(myisset("card") && !$myturn )
{
echo "please wait until it's your turn! \n";
}
if($seq!=4 && $trickNR>=1)
echo " \n \n"; /* end div trick, end li trick */
/* display points in case game is over */
if($mystatus=='gameover' && DB_get_game_status_by_gameid($gameid)=='gameover' )
{
echo "
Score \n".
" \n";
/* add pic for re/contra
"
\n";*/
$result = DB_query("SELECT User.fullname, IFNULL(SUM(Card.points),0), Hand.party,Hand.position 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" );
while( $r = DB_fetch_array($result))
echo "
\n".
"
".$r[2]." ".$r[1]."
\n".
"
\n";
echo "
\n \n"; /* end div trick, end li trick */
}
echo "
prev \n";
echo "
next \n\n"; /* end ul tricks*/
echo "
Personal notes: \n";
$notes = DB_get_notes_by_userid_and_gameid($myid,$gameid);
foreach($notes as $note)
echo "$note
\n";
echo "Insert note: \n";
echo " \n";
$mycards = DB_get_hand($me);
$mycards = mysort($mycards,$gametype);
echo "
\n";
if($myturn && !myisset("card") && $mystatus=='play' )
{
echo "Hello ".$myname.", it's your turn! \n";
echo "Your cards are: \n";
/* do we have to follow suite? */
$followsuit = 0;
if(have_suit($mycards,$firstcard))
$followsuit = 1;
foreach($mycards as $card)
{
if( ($followsuit && !same_type($card,$firstcard)) ||
( (int)($card)==19 && ($RULES['schweinchen']=='second'||$RULES['schweinchen']=='secondaftercall')
&& $GAME['schweinchen-who']==$me && !$GAME['schweinchen-first'] )
)
display_card($card,$PREF["cardset"]);
else
display_link_card($card,$PREF["cardset"]);
}
}
else if($mystatus=='play' )
{
echo "Your cards are: \n";
foreach($mycards as $card)
display_card($card,$PREF["cardset"]);
}
else if($mystatus=='gameover')
{
$oldcards = DB_get_all_hand($me);
$oldcards = mysort($oldcards,$gametype);
echo "Your cards were: \n";
foreach($oldcards as $card)
display_card($card,$PREF["cardset"]);
$userids = DB_get_all_userid_by_gameid($gameid);
foreach($userids as $user)
{
$userhash = DB_get_hash_from_gameid_and_userid($gameid,$user);
if($userhash!=$me)
{
echo " ";
$name = DB_get_name('userid',$user);
$oldcards = DB_get_all_hand($userhash);
$oldcards = mysort($oldcards,$gametype);
echo "$name's cards were: \n";
foreach($oldcards as $card)
display_card($card,$PREF["cardset"]);
}
};
}
echo "
\n";
/* if the game is over do some extra stuff, therefore exit the swtich statement if we are still playing*/
if($mystatus=='play')
break;
/* the following happens only when the gamestatus is 'gameover' */
/* check if game is over, display results */
if(DB_get_game_status_by_gameid($gameid)=='play')
{
echo "The game is over for you.. other people still need to play though";
}
else
{
$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" );
echo "
Totals:
\n";
while( $r = DB_fetch_array($result))
echo " ".$r[0]." ".$r[1]."
\n";
$queryresult = DB_query("SELECT timediff(mod_date,create_date) ".
" FROM Game WHERE id='$gameid'");
$r = DB_fetch_array($queryresult);
echo "
This game took ".$r[0]." hours.
";
echo "
\n Points Re: \n";
$queryresult = DB_query("SELECT score FROM Score ".
" WHERE game_id=$gameid AND party='re'".
" ");
while($r = DB_fetch_array($queryresult) )
echo " ".$r[0]." \n";
echo "
\n";
echo "
\n Points Contra: \n";
$queryresult = DB_query("SELECT score FROM Score ".
" WHERE game_id=$gameid AND party='contra'".
" ");
while($r = DB_fetch_array($queryresult) )
echo " ".$r[0]." \n";
echo "
\n";
echo "
\n";
}
break;
default:
myerror("error in testing the status");
}
/* output left menu */
display_user_menu();
/* output right menu */
/* display rule set for this game */
echo "
\n";
if($gamestatus != 'pre')
echo " Gametype: $GT \n";
echo "Rules: \n";
echo "10ofhearts : ".$RULES["dullen"] ." \n";
echo "schweinchen: ".$RULES["schweinchen"] ." \n";
echo "call: ".$RULES["call"] ." \n";
echo "
\n";
if($gamestatus == 'play' )
output_form_calls($me);
/* get time from the last action of the game */
$r = DB_query_array("SELECT mod_date from Game WHERE id='$gameid' " );
$gameend = time() - strtotime($r[0]);
if($gamestatus == 'play' || $gameend < 60*60*24*7)
{
echo " \nA short comment: \n";
echo " ";
}
echo " \n \n";
$session = DB_get_session_by_gameid($gameid);
$score = generate_score_table($session);
echo $score;
echo "\n";
echo "\n";
if($mystatus=='gameover' && DB_get_game_status_by_gameid($gameid)=='gameover' )
{
$session = DB_get_session_by_gameid($gameid);
$result = DB_query("SELECT id,create_date FROM Game".
" WHERE session=$session".
" ORDER BY create_date DESC".
" LIMIT 1");
$r = -1;
if($result)
$r = DB_fetch_array($result);
if(!$session || $gameid==$r[0])
{
/* suggest a new game with the same people in it, just rotated once (unless last game was solo) */
$names = DB_get_all_names_by_gameid($gameid);
$type = DB_get_gametype_by_gameid($gameid);
if($type=="solo")
{
$solo = DB_get_solo_by_gameid($gameid);
if($solo!='silent') /* repeat game with same first player */
output_ask_for_new_game($names[0],$names[1],$names[2],$names[3],$gameid);
else /* rotate normally */
output_ask_for_new_game($names[1],$names[2],$names[3],$names[0],$gameid);
}
else /* rotate normally */
output_ask_for_new_game($names[1],$names[2],$names[3],$names[0],$gameid);
}
}
output_footer();
DB_close();
exit();
?>