Welcome to E-Doko

",$message); echo "
To: $To
Subject: $Subject
$message
\n"; } else mail($To,$Subject,$message); return; } function parse_status() { global $game,$history,$player,$hash,$lines; $game["init"] = 0; $game["solo-who"] = -1; $game["solo-what"] = "todo"; $game["wedding"] = -1; $game["poverty"] = ""; $game["nines"] = -1; $game["startplayer"] = 0; for($i=0;$i<4;$i++) { $tmp = explode( ":",$lines[$i]); $hash[$i] = $tmp[0]; $player[$tmp[0]]["number"] = $i; $player[$tmp[0]]["hash"] = $tmp[0]; $player[$tmp[0]]["name"] = $tmp[1]; $player[$tmp[0]]["email"] = $tmp[2]; $player[$tmp[0]]["option"] = $tmp[3]; $player[$tmp[0]]["points"] = $tmp[4]; $player[$tmp[0]]["cards"] = $tmp[5]; if(ereg("s",$tmp[3])) $game["init"]++; /* how many players are ready? */ if(ereg("P",$tmp[3])) $game["poverty"].= $i; /* players with poverty, could be two, so use a string */ if(ereg("N",$tmp[3])) $game["nines"] = $i; /* the player with too many nines, only one possible */ if(ereg("W",$tmp[3])) $game["wedding"] = $i; /* the player with the wedding, also only one possible */ if(ereg("([OSQJCAH])",$tmp[3],$match) && ($game["solo-who"]<0) ) { $game["solo-who"] = $i; $game["startplayer"] = $i; switch($match[1]) { case "O": $game["solo-what"] = "No Trump"; case "S": $game["solo-what"] = "Trump"; case "Q": $game["solo-what"] = "Queen"; case "J": $game["solo-what"] = "Jack"; case "C": $game["solo-what"] = "Club"; case "A": $game["solo-what"] = "Spade"; case "H": $game["solo-what"] = "Heart"; } } } /* save the game history */ for($i=4;$i"; return 0; } } function display_card($card) { if( $card/2 - (int)($card/2) == 0.5) echo "\"".card_to_name($card)."\"\n"; else echo "\"".card_to_name($card-1)."\"\n"; return; } function display_link_card($card,$me) { if( $card/2 - (int)($card/2) == 0.5) echo "\"".card_to_name($card)."\"\n"; else echo "\"".card_to_name($card-1)."\"\n"; return; } function save_status() { global $player,$game,$hash,$history; $output = fopen("status.txt","w"); if ($output) { foreach($hash as $key) { /* sorting the options, not sure why I do that actually */ $tmp=""; if( ereg("i",$player[$key]["option"]) ) $tmp.="i"; if( ereg("s",$player[$key]["option"]) ) $tmp.="s"; if( ereg("t",$player[$key]["option"]) ) $tmp.="t"; if( ereg("c",$player[$key]["option"]) ) $tmp.="c"; if( ereg("N",$player[$key]["option"]) ) $tmp.="N"; if( ereg("W",$player[$key]["option"]) ) $tmp.="W"; if( ereg("P",$player[$key]["option"]) ) $tmp.="P"; if( ereg("O",$player[$key]["option"]) ) $tmp.="O"; if( ereg("S",$player[$key]["option"]) ) $tmp.="S"; if( ereg("Q",$player[$key]["option"]) ) $tmp.="Q"; if( ereg("J",$player[$key]["option"]) ) $tmp.="J"; if( ereg("C",$player[$key]["option"]) ) $tmp.="C"; if( ereg("A",$player[$key]["option"]) ) $tmp.="A"; if( ereg("H",$player[$key]["option"]) ) $tmp.="H"; $player[$key]["option"]=$tmp; /* saving the player stats */ fwrite($output,"".$player[$key]["hash"].":" ); fwrite($output,"".$player[$key]["name"].":" ); fwrite($output,"".$player[$key]["email"].":" ); fwrite($output,"".$player[$key]["option"].":" ); fwrite($output,"".$player[$key]["points"].":" ); fwrite($output,"".$player[$key]["cards"] .":"); fwrite($output,"\n"); } fwrite($output,"\n"); foreach($history as $line) fwrite($output,$line); fwrite($output,"\n"); fclose($output); } else echo "can't open file for writing, please inform the admin."; return; } /***************** M A I N **************************/ echo "

If you find bugs, please list them in the wiki.

\n"; echo "

Names that are underlined have a comment, which you can access by hovering over the name with your mouse ;)

\n"; echo "
\n"; /* end header */ $history=array(); /* check for status file and read it, if possible */ if(file_exists("status.txt")) $lines = file("status.txt"); else die("no file"); /* check if we want to start a new game */ if( isset($_REQUEST["PlayerA"]) && isset($_REQUEST["PlayerB"]) && isset($_REQUEST["PlayerC"]) && isset($_REQUEST["PlayerD"]) && isset($_REQUEST["EmailA"]) && isset($_REQUEST["EmailB"]) && isset($_REQUEST["EmailC"]) && isset($_REQUEST["EmailD"]) && sizeof($lines<2)) { $PlayerA = $_REQUEST["PlayerA"]; $PlayerB = $_REQUEST["PlayerB"]; $PlayerC = $_REQUEST["PlayerC"]; $PlayerD = $_REQUEST["PlayerD"]; $EmailA = $_REQUEST["EmailA"] ; $EmailB = $_REQUEST["EmailB"] ; $EmailC = $_REQUEST["EmailC"] ; $EmailD = $_REQUEST["EmailD"] ; $hashA = md5("AGameOfDoko".$PlayerA.$EmailA); $hashB = md5("AGameOfDoko".$PlayerB.$EmailB); $hashC = md5("AGameOfDoko".$PlayerC.$EmailC); $hashD = md5("AGameOfDoko".$PlayerD.$EmailD); /* send out email, check for error with email */ $message = "\n". "you are invited to play a game of DoKo (that is to debug the program ;).\n". "Place comments and bug reports here:\n". "http://wiki.nubati.net/index.php?title=EmailDoko\n\n". "The whole round would consist of the following players:\n". "$PlayerA\n". "$PlayerB\n". "$PlayerC\n". "$PlayerD\n\n". "If you want to join this game, please follow this link:\n\n". " ".$host."?a="; mymail($EmailA,"You are invited to a game of DoKo","Hello $PlayerA,\n".$message.$hashA); mymail($EmailB,"You are invited to a game of DoKo","Hello $PlayerB,\n".$message.$hashB); mymail($EmailC,"You are invited to a game of DoKo","Hello $PlayerC,\n".$message.$hashC); mymail($EmailD,"You are invited to a game of DoKo","Hello $PlayerD,\n".$message.$hashD); /* read in random.txt */ if(file_exists("random.txt")) $random = file("random.txt"); else die("no random file"); $randomNR = explode( ":", $random[2] ); /* write initial status into file */ $output = fopen("status.txt","w"); if ($output) { fwrite($output, "$hashA:$PlayerA:$EmailA:::" ); for($i=0;$i<11;$i++) fwrite($output,"$randomNR[$i];" ); fwrite($output,"$randomNR[11]:" ); $i++; fwrite($output,"\n"); fwrite($output, "$hashB:$PlayerB:$EmailB:::" ); for(;$i<23;$i++) fwrite($output,"$randomNR[$i];" ); fwrite($output,"$randomNR[23]:" ); $i++; fwrite($output,"\n"); fwrite($output, "$hashC:$PlayerC:$EmailC:::" ); for(;$i<35;$i++) fwrite($output,"$randomNR[$i];" ); fwrite($output,"$randomNR[35]:" ); $i++; fwrite($output,"\n"); fwrite($output, "$hashD:$PlayerD:$EmailD:::"); for(;$i<47;$i++) fwrite($output,"$randomNR[$i];" ); fwrite($output,"$randomNR[47]:" ); fwrite($output,"\n"); fclose($output); } else echo "can't open file for writing"; }; /* reread file */ if(file_exists("status.txt")) $lines = file("status.txt"); else die("no file"); /* test if a game is running, else output everything for a new game */ if(sizeof($lines)<2) { ?>

no game in progress, please input 4 names and email addresses, please make sure that the addresses are correct!

Name: Email:
Name: Email:
Name: Email:
Name: Email:
Do you want to play a game of DoKo? yes no
Do you want to get an email for every card played or only if it your move? every card only on my turn
\n"; echo "\n"; echo "\n"; echo "
\n"; } } /* *** * * * * *** * * * * *** * yes? email him his hand, ask for solo, poverty, email every move or every card? */ if(isset($_REQUEST["b"])) { $b = $_REQUEST["b"]; if( ereg("s",$player[$b]["option"]) && $game["init"]<4) { /* the player already filled out everything */ echo "just wait for the game to start"; } else if( (!isset($_REQUEST["in"])|| !isset($_REQUEST["update"])) && !ereg("i",$player[$b]["option"])) { /* the player didn't fill out the form at "a" correctly */ echo "go back to "; echo " here and fill out the form
\n"; } else { /* show the hand and check if the player is sick*/ if($_REQUEST["in"]=="no") { /* player doesn't want to play, cancel the game */ for($i=0;$i<4;$i++) { $message = "Hello ".$player[$hash[$i]]["name"].",\n\n". "the game has been canceled due to the request of one of the players.\n"; mymail($player[$hash[$i]]["email"],"[DoKo-Debug] the game has been canceled",$message); } /* canceling the game is as easy as removing the contents of the status file*/ $output = fopen("status.txt","w"); if($output) fclose($output); else echo "problem opening file"; } else { /* player wants to play, save information from "a"*/ if($_REQUEST["update"]=="card") $player[$b]["option"] .= "c"; else $player[$b]["option"] .= "t"; $player[$b]["option"] .= "i"; /* player finished stage "a" */ save_status(); $allcards = $player[$b]["cards"]; $mycards = explode(";",$allcards); sort($mycards); echo "

your cards are:
\n"; foreach($mycards as $card) display_card($card); echo "

\n"; ?>

aehm... at the moment poverty is not implented. so I guess you need to play a normal game, even if you have less than 3 trump :(...sorry

do you want to play solo?
"; echo " no
\n"; } else { echo " no
\n"; }; echo "do you have poverty?"; if(count_trump($player[$b]["cards"])<4) { echo " yes"; echo " no
\n"; } else { echo " no
\n"; }; echo "do you have too many nines?"; if(count_nines($player[$b]["cards"])>4) { echo " yes"; echo " no
\n"; } else { echo " no
\n"; }; echo "\n"; echo "\n"; echo "
\n"; } } } if(isset($_REQUEST["c"])) { $c = $_REQUEST["c"]; if( ereg("s",$player[$c]["option"]) && $game["init"]<4 ) { /* the player already filled out everything */ echo "

just wait for the game to start

\n"; } else if(!isset($_REQUEST["solo"]) || !isset($_REQUEST["wedding"]) || !isset($_REQUEST["poverty"]) || !isset($_REQUEST["nines"]) ) {/* player still needs to fill out the form */ echo "go back to "; echo " here and fill out the form
\n"; } else if($game["init"]<4) { /* save information */ if( $_REQUEST["solo"]!="No") { switch($_REQUEST["solo"]) { case "No trump": $player[$c]["option"].="O"; break; case "Normal solo": $player[$c]["option"].="S"; break; case "Queen solo": $player[$c]["option"].="Q"; break; case "Jack solo": $player[$c]["option"].="J"; break; case "Club solo": $player[$c]["option"].="C"; break; case "Spade solo": $player[$c]["option"].="A"; break; case "Hear solo": $player[$c]["option"].="H"; break; } } else if($_REQUEST["wedding"] == "yes") { echo "wedding was chosen
\n"; $player[$c]["option"].="W"; } else if($_REQUEST["poverty"] == "yes") { echo "poverty was chosen
\n"; $player[$c]["option"].="P"; } else if($_REQUEST["nines"] == "yes") { echo "nines was chosen
\n"; $player[$c]["option"].="N"; } /* player finished setup */ $player[$c]["option"].="s"; save_status(); /* reread status file, to get the correct startplayer, etc */ if(file_exists("status.txt")) $lines = file("status.txt"); else die("no file"); parse_status(); if($game["init"]==4 && $player[$c]["number"]==$game["startplayer"]) { echo "

The game can start now, it's your turn, please use this link to play a card.

\n"; } else if($game["init"]==4) { $message = "The game can start now, it's your turn, please use this link to play a card:\n". $host."?me=".$hash[$game["startplayer"]]."\n"; mymail($player[$hash[$game["startplayer"]]]["email"],"[DoKo-debug] let's go",$message); echo "

The game has started. An email has been sent out to the first player.

\n"; } else { echo "

You're in. Once everyone has filled out the form, ". "the game will start and you'll get an eamil on your turn.

\n"; } } } /* END SETUP */ /* the game */ if($game["init"]==4) { /* check for sickness, only would need to do this on the first trick really...*/ /***** someone has 5 nines and no one is playing solo => cancel game */ if($game["nines"]>=0 && $game["solo-who"]<0) { $message = $player[$hash[$game["poverty"]]]["nines"]." has more than 4 nines. Game aborted!\n"; for($i=0;$i<4;$i++) mymail($player[$hash[$i]]["email"],"[DoKo-debug] the game has been canceled",$message); $output = fopen("status.txt","w"); if($output) fclose($output); else echo "problem opening file"; }; /* who is requesting this*/ if(!isset($_REQUEST["me"])) { if(!isset($_REQUEST["recovery"])) { echo "A game is in progress and kibitzing is not allowed. Sorry!.
\n"; echo "In case you are playing, but lost your email or can't access the game anymore, please input your email here:
\n"; ?>
recorvery:
=0) { $message = "Please try this link: ".$host."?me=".$hash[$ok]."\n". "\n if this doesn't work, contact the admin.\n"; mymail($recovery,"[DoKo-Debug] recovery ",$message); echo "

An email with the game information has been sent.

\n"; } else { echo "

can't find this email address, sorry.

\n"; }; } /* end recovery */ } else { /* $me is set */ $me = $_REQUEST["me"]; /* output if we are playing a solo or a wedding */ if($game["solo-who"]>=0) echo $player[$hash[$game["solo-who"]]]["name"]." is playing a ".$game["solo-what"]." solo!
\n"; else if($game["wedding"]>=0) echo $player[$hash[$game["wedding"]]]["name"]." is playing a wedding!
\n"; /* show history */ foreach($history as $play) { $trick = explode(":",$play); $last=-2; /* found old trick, display it */ if(sizeof($trick)==5) echo "
\n"; else echo "
\n"; for($i=0;$i",$card)) { $tmp = explode("->",$card); echo "
"; if(strlen($tmp[2])>0) echo ""; else echo " "; echo $player[$hash[$tmp[0]]]["name"]; /* check for comment */ if(strlen($tmp[2])>0) echo " ".$tmp[2].""; echo " \n "; display_card($tmp[1]); $last = $tmp[0]; echo "
\n"; } } echo "
\n"; } /* figure out who needs to play next */ $next = $last + 1; if ($next>=4) $next -= 4 ; if($last<0) $next = $history[sizeof($history)-1][0]; /* are we trying to play a card? */ if(isset($_REQUEST["card"])) { if($hash[$next]==$me) { $card = $_REQUEST["card"]; $mycards = explode(";",$player[$me]["cards"]); /* do we have that card */ if(in_array($card,$mycards)) { /* delete card from array */ $tmp = array(); foreach($mycards as $m) if($m != $card) $tmp[]=$m; $tmp2=""; for($i=0;$i".$card.":\n"; } else { $tmp = explode(":",$history[sizeof($history)-1]); $tmp[sizeof($tmp)-1] = "".$player[$me]["number"]."->".$card.":"; $history[sizeof($history)-1]=join(":",$tmp); } save_status(); echo "
"; echo " you played
"; display_card($card); echo "
\n"; ?>
A short comment:
3)$mynext-=4; if((ereg("c",$player[$hash[$i]]["option"]) || $i==$mynext) && $hash[$i]!=$me) { $message = " Hello ".$player[$hash[$i]]["name"].",\n\n"; if($i==$mynext) { $message .= "it's your turn now.\n". "Use this link to play a card: ".$host."?me=".$hash[$i]."\n\n" ; } $message .= $player[$me]["name"]." has played the following card ". card_to_name($card)."\n"; if($game["solo-who"]>=0) $message .= $player[$hash[$game["solo-who"]]]["name"]." is playing a ". $game["solo-what"]." solo!\n"; mymail($player[$hash[$i]]["email"],"[DoKo-debug] a card has been played",$message); if($debug) echo " next player
\n"; } } } else echo "seems like you don't have that card
\n"; } } /* end if card is set */ else if(isset($_REQUEST["comment"])) { /*save comment */ $comment = $_REQUEST["comment"]; $tmp = explode(":",$history[sizeof($history)-1]); /*last played trick */ $tmp2 = explode("->",$tmp[sizeof($tmp)-2]); /*last played card */ $comment = str_replace(":","",$comment); /*can't have ":" in comments */ if(sizeof($tmp2)<=2) $tmp[sizeof($tmp)-2] .= "->".$comment; $history[sizeof($history)-1]=join(":",$tmp); save_status(); } else if(isset($_REQUEST["win"]) && strlen($history[sizeof($history)-1])>3) { /* count points, email winner */ $win = $_REQUEST["win"]; if(strlen($player[$hash[0]]["cards"])) $history[] = $win.":\n"; /* email the player who needs to move next*/ for($i=0;$i<4;$i++) { if((ereg("c",$player[$hash[$i]]["option"]) || $i==$win) ) { $message = " Hello ".$player[$hash[$i]]["name"].",\n\n"; if($i == $win) { $message .= "You won the last trick,it's your turn now.\n". "Use this link to play a card: ".$host."?me=".$hash[$i]."\n\n" ; } else $message .= $player[$hash[$win]]["name"]." has won the last trick\n". "Use this link to look at the game: ".$host."?me=".$hash[$i]."\n\n" ; if($game["solo-who"]>=0) $message.= $player[$hash[$game["solo-who"]]]["name"]." is playing a ". $game["solo-what"]." solo!\n"; mymail($player[$hash[$i]]["email"],"[DoKo-debug] a card has been played",$message); if($debug) echo " next player
\n"; } } /* count points of the last trick */ $points = 0; $tmp = explode(":",$history[sizeof($history)-2]); for($i=0;$i<4;$i++) { $tmp2 = explode("->",$tmp[$i]); $c = $tmp2[1]; $points += card_value($c); } $player[$hash[$win]]["points"] += $points; echo "
\n ".$player[$hash[$win]]["name"]." won: $points Points
\n"; save_status(); }; /* end if win is set */ echo "
\n"; /* check last history entry: end of a trick? ask who won it, unless it was the last trick */ $tmp = explode(":",$history[sizeof($history)-1]); if(sizeof($tmp)==5 && strlen($player[$hash[0]]["cards"])) { ?>
who won? "; echo ""; ?>
the next player
\n"; if(strlen(trim($player[$me]["cards"]))==0) { echo "
game over, count points
\n"; for($i=0;$i<4;$i++) { echo $player[$hash[$i]]["name"]." got ".$player[$hash[$i]]["points"]."
\n"; } } } echo "
\n"; } /* end check for winner */ /* do we still have cards? display them */ if(strlen(trim($player[$me]["cards"]))>0 ) { $allcards = trim($player[$me]["cards"]); $mycards = explode(";",$allcards); sort($mycards); echo "

\n"; /* is it our turn? */ if($hash[$next]==$me && !isset($_REQUEST["card"]) && !isset($_REQUEST["win"])) { echo "ITS YOUR TURN!
\n"; echo "Your cards are:
\n"; foreach($mycards as $card) display_link_card($card,$me); } else { /* not our turn, just show the hand */ echo "Your cards are:
\n"; foreach($mycards as $card) display_card($card); } echo "

\n"; } } } } ?>