X-Git-Url: https://git.nubati.net/cgi-bin/gitweb.cgi?p=e-DoKo.git;a=blobdiff_plain;f=include%2Ffunctions.php;h=c6544131045bde1fd6725c6cf099b5ac061d55b1;hp=16d094c343f3f77707495616110c0f69b97affc5;hb=af2046f113109cc6ceaafcbce96377978e12c5a5;hpb=c81c7401e5db346fb07aa54183c1e6456d044a9b
diff --git a/include/functions.php b/include/functions.php
index 16d094c..c654413 100644
--- a/include/functions.php
+++ b/include/functions.php
@@ -73,15 +73,86 @@ function config_check()
return;
}
-function mymail($uid,$subject,$message)
+/* define possible status for email subsjects */
+define("GAME_CANCELED", 0);
+define("GAME_CANCELED_POVERTY", 1);
+define("GAME_CANCELED_TIMEOUT", 2);
+define("GAME_YOUR_TURN", 3);
+define("GAME_READY", 4);
+define("GAME_POVERTY", 5);
+define("GAME_DPOVERTY", 6);
+define("GAME_OVER", 7);
+define("GAME_RECOVERY", 8);
+define("GAME_REMINDER", 9);
+define("GAME_NEW", 10);
+
+/* define possible status for showing cards */
+
+define("CARDS_EMPTY", 0); /* show player's hand*/
+define("CARDS_SHOW", 1); /* show player's hand*/
+define("CARDS_MYTURN", 2); /* show radiobuttons for cards that can be played*/
+define("CARDS_EXCHANGE", 3); /* do we need to return cards to our partner in poverty?*/
+define("CARDS_GAMEOVER_ME", 4); /* show all cards from everyone*/
+define("CARDS_GAMEOVER", 5); /* show all cards from everyone (looking at someone else's game)*/
+
+ /* cards_status: SHOW show our hand
+ * MYTURN show radiobutton for cards that can be played
+ * EXCHANGE do we need to return cards to our partner in poverty?
+ * GAMEOVER show all cards from everyone
+ */
+
+function mymail($uid,$gameid=0,$type,$message)
{
- global $EmailName;
+ global $EmailName,$WIKI;
/* do we send the email right away or save it in the database? */
$send_now = 1;
/* add standard header and footer */
- $subject = "$EmailName".$subject;
+ $subject = "$EmailName ";
+ if($gameid)
+ $game = DB_format_gameid($gameid);
+ else
+ $game = '';
+
+ switch($type)
+ {
+ case GAME_CANCELED:
+ $subject.=sprintf(_("Game %s canceled"),$game);
+ break;
+ case GAME_CANCELED_POVERTY:
+ $subject.=sprintf(_("Game %s canceled (poverty not resolved)"),$game);
+ break;
+ case GAME_CANCELED_TIMEOUT:
+ $subject.=sprintf(_("Game %s canceled (timed out)"),$game);
+ break;
+ case GAME_YOUR_TURN:
+ $subject.=sprintf(_("A card has been played in game %s"),$game);
+ break;
+ case GAME_READY:
+ $subject.=sprintf(_("Ready, set, go... (game %s)"),$game);
+ break;
+ case GAME_POVERTY:
+ $subject.=sprintf(_("Poverty (game %s)"),$game);
+ break;
+ case GAME_DPOVERTY:
+ $subject.=sprintf(_("Double poverty (game %s)"),$game);
+ break;
+ case GAME_OVER:
+ $subject.=sprintf(_("Game over (game %s)"),$game);
+ break;
+ case GAME_RECOVERY:
+ $subject.=_("Recovery");
+ break;
+ case GAME_REMINDER:
+ $subject.=sprintf(_("Reminder: game %s it's your turn"),$game);
+ break;
+ case GAME_NEW:
+ $subject.=sprintf(_("You are invited to a game of DoKo (game %s)"),$game);
+ break;
+ default:
+ $subject.=sprintf(_("Problem with email, contact admin (errorcode %d)"),$gameid);
+ }
/* standard goodbye */
$footer = "\nHave a nice day\n".
@@ -89,8 +160,7 @@ function mymail($uid,$subject,$message)
"-- \n".
"You can change your mail delivery mode in the preference menu.\n".
'web: http://doko.nubati.net '.
- 'help: http://wiki.nubati.net/EmailDoko '.
- 'bugs: http://wiki.nubati.net/EmailDokoIssues';
+ "help, bugs, etc.: $WIKI";
if(is_array($uid))
{
@@ -455,6 +525,39 @@ function count_trump($cards,$status='pregame')
return $trump;
}
+function check_low_trump($cards)
+{
+ global $RULES;
+
+ if($RULES['lowtrump']=='none')
+ return 0;
+
+ /* check if we have low trump */
+
+ $lowtrump=1;
+ foreach($cards as $card)
+ {
+ /* card a trump, but not a diamond? */
+ if( $card<19 )
+ $lowtrump=0;
+ }
+
+ /* handle case where player has schweinchen */
+ if( in_array("19",$cards) && in_array("20",$cards) )
+ switch($RULES["schweinchen"])
+ {
+ case "both":
+ case "second":
+ case "secondaftercall":
+ $lowtrump=0;
+ break;
+ case "none":
+ break;
+ }
+
+ return $lowtrump;
+}
+
function create_array_of_random_numbers($useridA,$useridB,$useridC,$useridD)
{
global $debug;
@@ -467,12 +570,12 @@ function create_array_of_random_numbers($useridA,$useridB,$useridC,$useridD)
$r[ 1]=2; $r[13]=23; $r[25]=14; $r[37]=38;
$r[ 2]=3; $r[14]=27; $r[26]=15; $r[38]=39;
$r[ 3]=4; $r[15]=16; $r[27]=28; $r[39]=40;
- $r[ 4]=5; $r[16]=17; $r[28]=29; $r[40]=41;
+ $r[ 4]=5; $r[16]=17; $r[28]=29; $r[40]=21;
$r[ 5]=18; $r[17]=6; $r[29]=30; $r[41]=42;
- $r[ 6]=21; $r[18]=7; $r[30]=31; $r[42]=43;
- $r[ 7]=22; $r[19]=8; $r[31]=32; $r[43]=44;
- $r[ 8]=45; $r[20]=9; $r[32]=19; $r[44]=33;
- $r[ 9]=46; $r[21]=10; $r[33]=20; $r[45]=24;
+ $r[ 6]=41; $r[18]=7; $r[30]=31; $r[42]=43;
+ $r[ 7]=22; $r[19]=8; $r[31]=32; $r[43]=20;
+ $r[ 8]=45; $r[20]=9; $r[32]=33; $r[44]=19;
+ $r[ 9]=46; $r[21]=10; $r[33]=44; $r[45]=24;
$r[10]=35; $r[22]=11; $r[34]=48; $r[46]=25;
$r[11]=36; $r[23]=12; $r[35]=34; $r[47]=26;
}
@@ -824,12 +927,12 @@ function can_call($what,$hash)
}
else if ( 9 == ($NRcards + $offset))
{
- if( ($mincall>=0 && $mincall==120) )
+ if( ($mincall>=0 && $mincall<=120 && $what<=90 ) )
return 2;
}
else if ( 9 < ($NRcards + $offset))
{
- if( ($mincall>=0 && $mincall==120) )
+ if( ($mincall>=0 && $mincall<=120 && $what<=90 ) )
return 1;
}
else if ( 6 == ($NRcards + $offset))
@@ -868,7 +971,7 @@ function can_call($what,$hash)
return 0;
}
-function display_table ()
+function display_table_begin ()
{
global $gameid, $GT, $debug,$INDEX,$defaulttimezone,$session;
global $RULES,$GAME,$gametype;
@@ -888,10 +991,57 @@ function display_table ()
"WHERE Hand.game_id='".$gameid."' ".
"ORDER BY position ASC");
- echo "
\n".
- "
\n";
- while($r = DB_fetch_array($result))
- {
+ $row0 = DB_fetch_array($result);
+ $row1 = DB_fetch_array($result);
+ $row2 = DB_fetch_array($result);
+ $row3 = DB_fetch_array($result);
+
+ echo "
\n";
+ display_single_user($row1);
+ echo "\n
\n";
+ display_single_user($row0);
+ echo "
\n";
+ display_single_user($row2);
+
+ return;
+}
+function display_table_end ()
+{
+ global $gameid, $GT, $debug,$INDEX,$defaulttimezone,$session;
+ global $RULES,$GAME,$gametype;
+
+ $result = DB_query("SELECT User.fullname as name,".
+ " Hand.position as position, ".
+ " User.id, ".
+ " Hand.party as party, ".
+ " Hand.sickness as sickness, ".
+ " Hand.point_call, ".
+ " User.last_login, ".
+ " Hand.hash, ".
+ " User.timezone, ".
+ " User.email ".
+ "FROM Hand ".
+ "LEFT JOIN User ON User.id=Hand.user_id ".
+ "WHERE Hand.game_id='".$gameid."' ".
+ "ORDER BY position ASC");
+
+ $row0 = DB_fetch_array($result);
+ $row1 = DB_fetch_array($result);
+ $row2 = DB_fetch_array($result);
+ $row3 = DB_fetch_array($result);
+
+ echo "
\n";
+ display_single_user($row3);
+ echo "
\n";
+
+ return;
+}
+
+function display_single_user($r)
+{
+ global $gameid, $GT, $debug,$INDEX,$defaulttimezone,$session;
+ global $RULES,$GAME,$gametype;
+
$name = $r[0];
$pos = $r[1];
$user = $r[2];
@@ -906,8 +1056,8 @@ function display_table ()
$lastlogin = strtotime($r[6]);
date_default_timezone_set($timezone);
$timenow = strtotime(date("Y-m-d H:i:s"));
- $gravatar = "$name
";
-
+ $gravatar = "$name
\n
";
echo "
\n";
@@ -925,7 +1075,7 @@ function display_table ()
else
echo " $gravatar \n";
if($debug)
- echo"\n";
+ echo" \n";
/* add hints for poverty, wedding, solo, etc */
if( $gametype != "solo")
@@ -933,101 +1083,110 @@ function display_table ()
echo " Schweinchen.
";
if($GT=="poverty" && $party=="re")
- if($sickness=="poverty")
+ if($sickness=="poverty" || ($RULES['lowtrump']=='poverty' && $sickness=='lowtrump'))
{
$userhash = DB_get_hash_from_gameid_and_userid($gameid,$user);
$cards = DB_get_all_hand($userhash);
$trumpNR = count_trump($cards,'all');
if($trumpNR)
- echo "
";
+ echo "
\n";
else
- echo "
";
+ echo "
\n";
}
else
- echo "
\" title=\"poverty partner\" />";
+ echo "
\n";
if($GT=="dpoverty")
if($party=="re")
- if($sickness=="poverty")
+ if($sickness=="poverty" || ($RULES['lowtrump']=='poverty' && $sickness=='lowtrump'))
{
$userhash = DB_get_hash_from_gameid_and_userid($gameid,$user);
$cards = DB_get_all_hand($userhash);
$trumpNR = count_trump($cards,'all');
if($trumpNR)
- echo "
";
+ echo "
\n";
else
- echo "
";
+ echo "
\n";
}
else
- echo "
\" title=\"poverty partner\" />";
+ echo "
\" title=\"poverty partner\" />\n";
else
- if($sickness=="poverty")
+ if($sickness=="poverty" || ($RULES['lowtrump']=='poverty' && $sickness=='lowtrump'))
{
$userhash = DB_get_hash_from_gameid_and_userid($gameid,$user);
$cards = DB_get_all_hand($userhash);
$trumpNR = count_trump($cards,'all');
if($trumpNR)
- echo "
";
+ echo "
\n";
else
- echo "
";
+ echo "
\n";
}
else
- echo "
\" title=\"poverty2 partner\" />";
+ echo "
\" title=\"poverty2 partner\" />\n";
if($GT=="wedding" && $party=="re")
if($sickness=="wedding")
- echo "
";
+ echo "
\n";
else
- echo "
";
+ echo "
\n";
if( (strpos($GT,"solo")!==false) && $party=="re")
{
if(strpos($GT,"queen")!==false)
- echo "
";
+ echo "
\n";
else if(strpos($GT,"jack")!==false)
- echo "
";
+ echo "
\n";
else if(strpos($GT,"club")!==false)
- echo "
";
+ echo "
\n";
else if(strpos($GT,"spade")!==false)
- echo "
";
+ echo "
\n";
else if(strpos($GT,"heart")!==false)
- echo "
";
+ echo "
\n";
else if(strpos($GT,"trumpless")!==false)
- echo "
";
+ echo "
\n";
else if(strpos($GT,"trump")!==false)
- echo "
";
+ echo "
\n";
}
/* add point calls */
if($call!=NULL)
{
if($party=="re")
- echo "
";
+ echo "
\n";
else
- echo "
";
+ echo "
\n";
switch($call)
{
case "0":
- echo "
";
+ echo "
\n";
break;
case "30":
- echo "
";
+ echo "
\n";
break;
case "60":
- echo "
";
+ echo "
\n";
break;
case "90":
- echo "
";
+ echo "
\n";
break;
}
}
- echo "
\n";
- echo "
".
- "".
- "\n";
+ echo "
";
+ echo "
";
/* show how many tricks the person made */
switch($wins)
{
@@ -1042,49 +1201,56 @@ function display_table ()
default:
echo "#tricks many"; break;
}
-
- echo " \n";
-
- }
- echo "
\n"; /* end output table */
-
-
- return;
+ echo "\n";
+ echo " \n";
}
-function display_user_menu($id)
+function display_user_menu($id, $skiphash=NULL)
{
global $WIKI,$INDEX;
- $result = DB_query("SELECT Hand.hash,Hand.game_id,Game.player from Hand".
- " LEFT JOIN Game On Hand.game_id=Game.id".
- " WHERE Hand.user_id='$id'".
- " AND ( Game.player='$id' OR ISNULL(Game.player) )".
- " AND ( Game.status='pre' OR Game.status='play' )".
- " ORDER BY Game.session" );
+ if($skiphash)
+ $result = DB_query("SELECT Hand.hash,Hand.game_id,Game.player from Hand".
+ " LEFT JOIN Game On Hand.game_id=Game.id".
+ " WHERE Hand.user_id='$id'".
+ " AND Hand.hash!='$skiphash'".
+ " AND ( Game.player='$id' OR ISNULL(Game.player) )".
+ " AND ( Game.status='pre' OR Game.status='play' )".
+ " ORDER BY Game.session" );
+ else
+ $result = DB_query("SELECT Hand.hash,Hand.game_id,Game.player from Hand".
+ " LEFT JOIN Game On Hand.game_id=Game.id".
+ " WHERE Hand.user_id='$id'".
+ " AND ( Game.player='$id' OR ISNULL(Game.player) )".
+ " AND ( Game.status='pre' OR Game.status='play' )".
+ " ORDER BY Game.session" );
$i=0;
while( $r = DB_fetch_array($result))
{
if($i==0)
{
- echo "\n\n";
return;
}
@@ -1156,7 +1322,8 @@ function generate_global_score_table()
/* save information in an array */
while( $r = DB_fetch_array($result))
- $player[$r[0]] = array('name'=> $r[1], 'points' => 0 ,'nr' => 0);
+ $player[$r[0]] = array('name'=> $r[1], 'points' => 0 , 'nr' => 0, 'active' => 0,
+ 'response' => 0 , 'solo' => 0, 'soloavg' => 0);
/* get points and generate table */
foreach($gameids as $gameid)
@@ -1182,9 +1349,53 @@ function generate_global_score_table()
}
}
+ /* add number of active games */
+ $result = DB_query_array_all("SELECT user_id, COUNT(*) as c " .
+ " FROM Hand".
+ " LEFT JOIN Game ON Game.id=game_id".
+ " WHERE Game.status IN ('pre','play')".
+ " GROUP BY user_id");
+
+ foreach($result as $res)
+ {
+ $player[$res[0]]['active'] = $res[1];
+ }
+
+ /* response time of users*/
+ $result = DB_query_array_all("SELECT user_id,".
+ "IFNULL(AVG(if(P1.sequence in (2,3,4),".
+ "-timestampdiff(MINUTE,mod_date,(select mod_date from Play P2 where P1.trick_id=P2.trick_id and P2.sequence=P1.sequence-1)),NULL )),1e9) as a ".
+ "FROM Play P1 ".
+ "LEFT JOIN Hand_Card ON P1.hand_card_id=Hand_Card.id ".
+ "LEFT JOIN Hand ON Hand.id=Hand_Card.hand_id ".
+ "GROUP BY user_id ");
+
+ foreach($result as $res)
+ {
+ $player[$res[0]]['response'] = $res[1];
+ }
+
+ /* most solos */
+ $result = DB_query_array_all("SELECT user_id as uid,".
+ " COUNT(*), ".
+ " COUNT(*)/(SELECT COUNT(*) FROM Hand LEFT JOIN User ON User.id=Hand.user_id WHERE User.id=uid) as c ".
+ " FROM Game ".
+ " LEFT JOIN Hand ON Hand.position=startplayer AND Game.id=Hand.game_id ".
+ " WHERE type='solo' AND Game.status='gameover' ".
+ " GROUP BY user_id ");
+
+ foreach($result as $res)
+ {
+ $player[$res[0]]['solo'] = $res[1];
+ $player[$res[0]]['soloavg'] = $res[2];
+ }
+
+
+ /* sort everything nicely */
+
function cmp($a,$b)
{
- if($a['nr']==0 ) return 1;
+ if($a['nr']==0) return 1;
if($b['nr']==0) return 1;
$a=$a['points']/$a['nr'];
@@ -1196,11 +1407,13 @@ function generate_global_score_table()
}
usort($player,'cmp');
+
foreach($player as $pl)
{
/* limit to players with at least 10 games */
if($pl['nr']>10)
- $return[] = array( $pl['name'], round($pl['points']/$pl['nr'],3), $pl['points'],$pl['nr']);
+ $return[] = array( $pl['name'], round($pl['points']/$pl['nr'],3), $pl['points'],$pl['nr'],$pl['active'],
+ $pl['response'],$pl['solo'],$pl['soloavg']);
}
return $return;
@@ -1391,6 +1604,9 @@ function cancel_game($why,$gameid)
case 'noplay':
DB_query("UPDATE Game SET status='cancel-noplay' WHERE id=$gameid");
break;
+ case 'lowtrump':
+ DB_query("UPDATE Game SET status='cancel-lowtrump' WHERE id=$gameid");
+ break;
}
/* set each player to gameover */
$result = DB_query("SELECT id FROM Hand WHERE game_id=".DB_quote_smart($gameid));