diff options
-rw-r--r-- | db.php | 5 | ||||
-rw-r--r-- | functions.php | 139 | ||||
-rw-r--r-- | index.php | 170 | ||||
-rw-r--r-- | output.php | 72 |
4 files changed, 246 insertions, 140 deletions
@@ -200,9 +200,10 @@ function DB_set_hand_status_by_hash($hash,$status) return; } -function DB_get_hand_status_by_userid($id) +function DB_get_hand_status_by_userid_and_gameid($uid,$gid) { - $result = mysql_query("SELECT status FROM Hand WHERE user_id=".DB_quote_smart($id)); + $result = mysql_query("SELECT status FROM Hand WHERE user_id=".DB_quote_smart($uid). + " AND game_id=".DB_quote_smart($gid)); $r = mysql_fetch_array($result,MYSQL_NUM); if($r) diff --git a/functions.php b/functions.php index 7cc2826..c4305b5 100644 --- a/functions.php +++ b/functions.php @@ -14,28 +14,123 @@ function mymail($To,$Subject,$message) return; } -function is_trump($c) { return (($c<27) ? 1:0);} -function is_club($c) { return (in_array($c,array('27','28','29','30','31','32','33','34')));} -function is_spade($c) { return (in_array($c,array('35','36','37','38','39','40','41','42')));} -function is_heart($c) { return (in_array($c,array('43','44','45','46','47','48')));} +function myisset() +{ + /* returns 1 if all names passed as args are defined by a GET or POST statement, + * else it returns 0 + */ + + $ok = 1; + $args = func_get_args(); + + foreach($args as $arg) + { + $ok = $ok * isset($_REQUEST[$arg]); + /* echo "$arg: ok = $ok <br />"; + */ + } + return $ok; +} -function compare_cards($a,$b,$mode) +function is_trump($c,$game) +{ + switch($game) + { + case "queen": + if(in_array($c,array('3','4','5','6','7','8','9','10'))) + return 1; + else + return 0; + break; + case "normal": + return (($c<27) ? 1:0); + break; + } +} + +function is_same_suite($c1,$c2,$game) +{ + switch($game) + { + case "queen": + /* clubs */ + if(in_array($c1,array('11','12','27','28','29','30','31','32','33','34')) && + in_array($c2,array('11','12','27','28','29','30','31','32','33','34')) ) + return 1; + /* spade */ + if(in_array($c1,array('13','14','35','36','37','38','39','40','41','42')) && + in_array($c2,array('13','14','35','36','37','38','39','40','41','42')) ) + return 1; + /* heart */ + if(in_array($c1,array( '1', '2','15','16','43','44','45','46','47','48')) && + in_array($c2,array( '1', '2','15','16','43','44','45','46','47','48')) ) + return 1; + /* diamonds */ + if(in_array($c1,array('17','18','19','20','21','22','23','24','25','26')) && + in_array($c2,array('17','18','19','20','21','22','23','24','25','26')) ) + return 1; + + return 0; + break; + case "normal": + /* clubs */ + if(in_array($c1,array('27','28','29','30','31','32','33','34')) && + in_array($c2,array('27','28','29','30','31','32','33','34')) ) + return 1; + /* spade */ + if(in_array($c1,array('35','36','37','38','39','40','41','42')) && + in_array($c2,array('35','36','37','38','39','40','41','42')) ) + return 1; + /* heart */ + if(in_array($c1,array('43','44','45','46','47','48')) && + in_array($c2,array('43','44','45','46','47','48')) ) + return 1; + + return 0; + break; + } +} + +function compare_cards($a,$b,$game) { /* if "a" is higher than "b" return 1, else 0, "a" being the card first played */ - /* don't think we need this */ + /* first map all cards to the odd number, + * this insure that the first card wins the trick + * if they are the same card + */ if( $a/2 - (int)($a/2) != 0.5) $a--; if( $b/2 - (int)($b/2) != 0.5) $b--; - switch($mode) + switch($game) { case "trumpless": break; case "jack": break; case "queen": + if(is_trump($a,$game) && $a<=$b) + return 1; + else if(is_trump($a,$game)) + return 0; + else + { /*$a is not a trump */ + if(is_trump($b,$game)) + return 0; + else + { + if(is_same_suite($a,$b,$game)) + if($a<=$b) + return 1; + else + return 0; + + /* not the same suit and no trump: a wins */ + return 1; + } + } break; case "trump": break; @@ -46,35 +141,25 @@ function compare_cards($a,$b,$mode) case "heart": break; case "normal": - /* first map all cards to the odd number */ - if(is_trump($a) && $a<=$b) + if($a==1 && $b==1) /* both 10 of hearts */ + return 0; /* second one wins. TODO should be able to set this at the start of a new game */ + if(is_trump($a,$game) && $a<=$b) return 1; - else if(is_trump($a) && $a>$b) + else if(is_trump($a,$game)) return 0; else { /*$a is not a trump */ - if(is_trump($b)) + if(is_trump($b,$game)) return 0; else { - /* both clubs? */ - if( is_club($a) && is_club($b)) - if($a<=$b) - return 1; - else - return 0; - /* both spade? */ - if( is_spade($a) && is_spade($b)) - if($a<=$b) - return 1; - else - return 0; - /* both heart? */ - if( is_heart($a) && is_heart($b)) + if(is_same_suite($a,$b,$game)) if($a<=$b) return 1; else return 0; + + /* not the same suit and no trump: a wins */ return 1; } } @@ -92,9 +177,9 @@ function get_winner($p,$mode) /* find out who won */ if( compare_cards($c1,$c2,$mode) && compare_cards($c1,$c3,$mode) && compare_cards($c1,$c4,$mode) ) return 1; - if( compare_cards($c2,$c3,$mode) && compare_cards($c2,$c4,$mode) ) + if( !compare_cards($c1,$c2,$mode) && compare_cards($c2,$c3,$mode) && compare_cards($c2,$c4,$mode) ) return 2; - if( compare_cards($c3,$c4,$mode) ) + if( !compare_cards($c1,$c3,$mode) && !compare_cards($c2,$c3,$mode) && compare_cards($c3,$c4,$mode) ) return 3; return 4; } @@ -1,26 +1,21 @@ <?php error_reporting(E_ALL); -include_once("config.php"); +include_once("config.php"); include_once("output.php"); /* html output only */ include_once("db.php"); /* database only */ include_once("functions.php"); /* the rest */ DB_open(); -/***************** M A I N **************************/ output_header(); - /* check if we want to start a new game */ -if(isset($_REQUEST["new"])) - output_form_for_new_game(); +if(myisset("new")) + output_form_for_new_game(); /*check if everything is ready to set up a new game */ -else if( isset($_REQUEST["PlayerA"]) && - isset($_REQUEST["PlayerB"]) && - isset($_REQUEST["PlayerC"]) && - isset($_REQUEST["PlayerD"]) ) +else if( myisset("PlayerA", "PlayerB","PlayerC","PlayerD" )) { $PlayerA = $_REQUEST["PlayerA"]; $PlayerB = $_REQUEST["PlayerB"]; @@ -49,7 +44,7 @@ else if( isset($_REQUEST["PlayerA"]) && /* create game */ $followup = NULL; - if(isset($_REQUEST["followup"])) + if(myisset("followup") ) { $followup= $_REQUEST["followup"]; mysql_query("INSERT INTO Game VALUES (NULL, NULL, '$randomNRstring', NULL, NULL,'pre','$followup' ,NULL)"); @@ -109,12 +104,11 @@ else if( isset($_REQUEST["PlayerA"]) && } /* end set up a new game */ -else if(isset($_REQUEST["me"])) +else if(myisset("me")) { - /* handle request from one specifig player, - * the hash is set on a per game base, so first just handle this game - * perhaps also show links to other games in a sidebar - */ + /* handle request from one specific player, + * the hash is set on a per game base + */ $me = $_REQUEST["me"]; @@ -123,7 +117,7 @@ else if(isset($_REQUEST["me"])) if(!$myid) { echo "Can't find you in the database, please check the url.<br />\n"; - echo "perhaps the game has been cancled."; + echo "perhaps the game has been cancled, check by login in <a href=\"$host\">here</a>."; exit(); } @@ -141,7 +135,7 @@ else if(isset($_REQUEST["me"])) DB_set_hand_status_by_hash($me,'init'); break; case 'init': - if( !isset($_REQUEST["in"]) || !isset($_REQUEST["update"])) + if( !myisset("in","update") ) { DB_set_hand_status_by_hash($me,'start'); echo "you need to answer both question"; @@ -183,17 +177,14 @@ else if(isset($_REQUEST["me"])) break; case 'check': - echo "no checking at the moment... you need to play a normal game. At the moment you need to reload this page to finish the setup."; - if(!isset($_REQUEST["solo"]) || - !isset($_REQUEST["wedding"]) || - !isset($_REQUEST["poverty"]) || - !isset($_REQUEST["nines"]) ) + echo "no checking at the moment... you need to play a normal game.". + " At the moment you need to reload this page to finish the setup."; + if(!myisset("solo","wedding","poverty","nines") ) { - DB_set_hand_status_by_hash($me,'init'); - /* problem: by setting it back to init, variables "in" and "update" are - * not set, so the player will be send back to the start, after seeing his hand - */ - echo "you need to fill out the form"; + /* all these variables have a pre-selected default, + * so we should never get here, + * unless a user tries to cheat ;) */ + echo "something went wrong...please contact the admin."; } else { @@ -237,17 +228,23 @@ else if(isset($_REQUEST["me"])) /* check if the game can start */ $userids = DB_get_all_userid_by_gameid($gameid); - $done=1; + $ok=1; foreach($userids as $user) - if(DB_get_hand_status_by_userid($user)!='play') - $done=0; + if(DB_get_hand_status_by_userid_and_gameid($user,$gameid)!='play') + $ok=0; - if($done) + if($ok) DB_set_game_status_by_gameid($gameid,'play'); break; case 'play': - case 'gameover': /*both entries here, so that the tricks are visible for both in case of 'play' there is a break later that skips the last part*/ + case 'gameover': + /* both entries here, so that the tricks are visible for both. + * in case of 'play' there is a break later that skips the last part + */ + + /* display useful things in divs */ + /* display local time */ echo "<div class=\"time\">\n Local times:<table>"; $users = array(); @@ -255,35 +252,35 @@ else if(isset($_REQUEST["me"])) foreach($users as $user) { $offset = DB_get_user_timezone($user); - $zone = return_timezone($offset); + $zone = return_timezone($offset); date_default_timezone_set($zone); - $name = DB_get_name_by_userid($user); + $name = DB_get_name_by_userid($user); echo "<tr> <td>$name</td> <td>".date("Y-m-d H:i:s")."</td></tr>\n"; }; echo "</table>\n</div>\n"; + display_status(); - /* display links to other games */ - echo "<div class=\"over\">\n"; + /* display links to the users status page */ $result = mysql_query("SELECT email,password from User WHERE id='$myid'" ); - $r = mysql_fetch_array($result,MYSQL_NUM); - echo "<form action=\"index.php\" method=\"post\">\n"; - echo " <input type=\"hidden\" name=\"email\" value=\"".$r[0]."\" />\n"; - echo " <input type=\"hidden\" name=\"password\" value=\"".$r[1]."\" />\n"; - echo " <input type=\"submit\" value=\"go to my user page\" />\n"; - echo "</form>\n"; - echo "</div>\n"; - + $r = mysql_fetch_array($result,MYSQL_NUM); + output_link_to_user_page($r[0],$r[1]); + display_news(); + /* end display useful things*/ + + /* has the game started? No, then just wait here...*/ $gamestatus = DB_get_game_status_by_gameid($gameid); if($gamestatus == 'pre') { echo "you need to wait for the others... <br />"; - break; + break; /* not sure this works... the idea is that you can + * only play a card after everyone is ready to play */ } - /* get everythin relevant to display the tricks */ + + /* get everything relevant to display the tricks */ $result = mysql_query("SELECT Hand_Card.card_id as card,". " User.fullname as name,". " Hand.position as position,". @@ -388,7 +385,7 @@ else if(isset($_REQUEST["me"])) $myturn = 0; /* do we want to play a card? */ - if(isset($_REQUEST["card"]) && $myturn) + if(myisset("card") && $myturn) { $card = $_REQUEST["card"]; $handid = DB_get_handid_by_hash($me); @@ -412,7 +409,7 @@ else if(isset($_REQUEST["me"])) $playid = DB_play_card($trickid,$handcardid,$sequence); /*check for coment */ - if(isset($_REQUEST["comment"])) + if(myisset("comment")) { DB_insert_comment($_REQUEST["comment"],$playid,$myid); }; @@ -430,11 +427,11 @@ else if(isset($_REQUEST["me"])) $mystatus='gameover'; } - /* if all players are done, set game status also to game over */ + /* if all players are done, set game status to game over */ $userids = DB_get_all_userid_by_gameid($gameid); $done=1; foreach($userids as $user) - if(DB_get_hand_status_by_userid($user)!='gameover') + if(DB_get_hand_status_by_userid_and_gameid($user,$gameid)!='gameover') $done=0; if($done) @@ -474,7 +471,7 @@ else if(isset($_REQUEST["me"])) echo "couldn't find card <br />\n"; } } - else if(isset($_REQUEST["card"]) && !$myturn ) + else if(myisset("card") && !$myturn ) { echo "please wait until it is your turn! <br />\n"; } @@ -483,19 +480,18 @@ else if(isset($_REQUEST["me"])) sort($mycards); echo "<div class=\"mycards\">\n"; - if($myturn && !isset($_REQUEST["card"])) + if($myturn && !myisset("card")) { echo "Hello ".$myname.", it's your turn! <br />\n"; echo "Your cards are: <br />\n"; echo "<form action=\"index.php?me=$me\" method=\"post\">\n"; foreach($mycards as $card) display_link_card($card); -?> - <br />A short comments:<input name="comment" type="text" size="30" maxlength="50" /> - <input type="hidden" name="me" value="<?php echo $me; ?>" /> - <input type="submit" value="move" /> - </form> - <?php + + echo "<br />\nA short comments:<input name=\"comment\" type=\"text\" size=\"30\" maxlength=\"50\" />\n"; + echo "<input type=\"hidden\" name=\"me\" value=\"$me\" />\n"; + echo "<input type=\"submit\" value=\"move\" />\n"; + echo "</form>\n"; } else if($mystatus=='play') { @@ -508,7 +504,7 @@ else if(isset($_REQUEST["me"])) /* check if we need to set status to 'gameover' is done during playing of the card */ if($mystatus=='play') break; - /* the following happens only when the gamestatus is 'gameover' */ + /* 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') { @@ -520,16 +516,7 @@ else if(isset($_REQUEST["me"])) /* suggest a new game with the same people in it, just rotated once */ $names = DB_get_all_names_by_gameid($gameid); - - echo "Do you want to continue playing?(This will start a new game, with the next person as dealer.)\n"; - echo "<form action=\"index.php\" method=\"post\">\n"; - echo " <input type=\"hidden\" name=\"PlayerA\" value=\"".($names[1])."\" />\n"; - echo " <input type=\"hidden\" name=\"PlayerB\" value=\"".($names[2])."\" />\n"; - echo " <input type=\"hidden\" name=\"PlayerC\" value=\"".($names[3])."\" />\n"; - echo " <input type=\"hidden\" name=\"PlayerD\" value=\"".($names[0])."\" />\n"; - echo " <input type=\"hidden\" name=\"followup\" value=\"".($gameid)."\" />\n"; - echo " <input type=\"submit\" value=\"keep playing\" />\n"; - echo "</form>\n"; + output_ask_for_new_game($names[1],$names[2],$names[3],$names[0],$gameid); } break; default: @@ -538,7 +525,7 @@ else if(isset($_REQUEST["me"])) exit(); } /* user status page */ - else if(isset($_REQUEST["email"]) && isset($_REQUEST["password"])) + else if(myisset("email","password")) { /* test id and password, should really be done in one step */ $email = $_REQUEST["email"]; @@ -576,6 +563,7 @@ else if(isset($_REQUEST["me"])) foreach ($names as $name) echo "$name <br />\n"; echo "</p>\n"; + echo "<p>Want to start a new game? remember 4 names from the list above and visit ". "<a href=\"".$host."?new\">this page.</a></p>"; } @@ -586,42 +574,12 @@ else if(isset($_REQUEST["me"])) exit(); } /* page for registration */ -else if(isset($_REQUEST["register"]) ) +else if(myisset("register") ) { - echo "IMPORTANT: passwords are going over the net as clear text, so pick an easy password. No need to pick anything complicated here ;)<br /><br />"; - echo "TODO: convert timezone into a menu<br />\n"; - echo "TODO: figure out a way to handle passwrods <br />\n"; -?> - <form action="index.php" method="post"> - <fieldset> - <legend>Register</legend> - <table> - <tr> - <td><label for="Rfullname">Full name:</label></td> - <td><input type="text" id="Rfullname" name="Rfullname" size="20" maxsize="30" /> </td> - </tr><tr> - <td><label for="Remail">Email:</label></td> - <td><input type="text" id="Remail" name="Remail" size="20" maxsize="30" /></td> - </tr><tr> - <td><label for="Rpassword">Password(will be displayed in cleartext on the next page):</label></td> - <td><input type="password" id="Rpassword" name="Rpassword" size="20" maxsize="30" /></td> - </tr><tr> - <td><label for="Rtimezone">Timezone:</label></td> - <td> - <input type="text" id="Rtimezone" name="Rtimezone" size="4" maxsize="4" value="+1" /> - </td> - </tr><tr> - <td colspan="2"> <input type="submit" value="register" /></td> - </table> - </fieldset> - </form> -<?php + output_register(); } /* new user wants to register */ -else if(isset($_REQUEST["Rfullname"]) && - isset($_REQUEST["Remail"] ) && - isset($_REQUEST["Rpassword"]) && - isset($_REQUEST["Rtimezone"]) ) + else if(myisset("Rfullname","Remail","Rpassword","Rtimezone") ) { $ok=1; if(DB_get_userid_by_name($_REQUEST["Rfullname"])) @@ -642,15 +600,15 @@ else if(isset($_REQUEST["Rfullname"]) && ",".DB_quote_smart($_REQUEST["Rtimezone"]).",NULL)"); if($r) - echo " added you to the database"; + echo " added you to the database"; else echo " something went wrong"; } } /* default login page */ else - { /* no new game, not in a game */ - home_page(); + { + output_home_page(); } output_footer(); @@ -22,6 +22,66 @@ function display_news() return; } +function output_link_to_user_page($email,$password) +{ + echo "<div class=\"over\">\n"; + echo "<form action=\"index.php\" method=\"post\">\n"; + echo " <input type=\"hidden\" name=\"email\" value=\"".$email."\" />\n"; + echo " <input type=\"hidden\" name=\"password\" value=\"".$password."\" />\n"; + echo " <input type=\"submit\" value=\"go to my user page\" />\n"; + echo "</form>\n"; + echo "</div>\n"; + + return; +} + +function output_register() +{ + echo "IMPORTANT: passwords are going over the net as clear text, so pick an easy password. No need to pick anything complicated here ;)<br /><br />"; + echo "TODO: convert timezone into a menu<br />\n"; + echo "TODO: figure out a way to handle passwrods <br />\n"; + ?> + <form action="index.php" method="post"> + <fieldset> + <legend>Register</legend> + <table> + <tr> + <td><label for="Rfullname">Full name:</label></td> + <td><input type="text" id="Rfullname" name="Rfullname" size="20" maxsize="30" /> </td> + </tr><tr> + <td><label for="Remail">Email:</label></td> + <td><input type="text" id="Remail" name="Remail" size="20" maxsize="30" /></td> + </tr><tr> + <td><label for="Rpassword">Password(will be displayed in cleartext on the next page):</label></td> + <td><input type="password" id="Rpassword" name="Rpassword" size="20" maxsize="30" /></td> + </tr><tr> + <td><label for="Rtimezone">Timezone:</label></td> + <td> + <input type="text" id="Rtimezone" name="Rtimezone" size="4" maxsize="4" value="+1" /> + </td> + </tr><tr> + <td colspan="2"> <input type="submit" value="register" /></td> + </table> + </fieldset> + </form> +<?php + return; +} + +function output_ask_for_new_game($playerA,$playerB,$playerC,$playerD,$oldgameid) +{ + echo "Do you want to continue playing?(This will start a new game, with the next person as dealer.)\n"; + echo "<form action=\"index.php\" method=\"post\">\n"; + echo " <input type=\"hidden\" name=\"PlayerA\" value=\"$playerA\" />\n"; + echo " <input type=\"hidden\" name=\"PlayerB\" value=\"$playerB\" />\n"; + echo " <input type=\"hidden\" name=\"PlayerC\" value=\"$playerC\" />\n"; + echo " <input type=\"hidden\" name=\"PlayerD\" value=\"$playerD\" />\n"; + echo " <input type=\"hidden\" name=\"followup\" value=\"$oldgameid\" />\n"; + echo " <input type=\"submit\" value=\"keep playing\" />\n"; + echo "</form>\n"; + + return; +} function output_form_for_new_game() { @@ -69,7 +129,7 @@ function check_for_sickness($me,$mycards) do you want to play solo? <select name="solo" size="1"> - <option>No</option> + <option selected="selected">No</option> <option>trumpless</option> <option>trump</option> <option>queen</option> @@ -85,7 +145,7 @@ function check_for_sickness($me,$mycards) echo "wedding?"; if(check_wedding($mycards)) { - echo " yes<input type=\"radio\" name=\"wedding\" value=\"yes\" />"; + echo " yes<input type=\"radio\" name=\"wedding\" value=\"yes\" checked=\"checked\" />"; echo " no <input type=\"radio\" name=\"wedding\" value=\"no\" /> <br />\n"; } else @@ -96,7 +156,7 @@ function check_for_sickness($me,$mycards) echo "do you have poverty?"; if(count_trump($mycards)<4) { - echo " yes<input type=\"radio\" name=\"poverty\" value=\"yes\" />"; + echo " yes<input type=\"radio\" name=\"poverty\" value=\"yes\" checked=\"checked\" />"; echo " no <input type=\"radio\" name=\"poverty\" value=\"no\" /> <br />\n"; } else @@ -107,7 +167,7 @@ function check_for_sickness($me,$mycards) echo "do you have too many nines?"; if(count_nines($mycards)>4) { - echo " yes<input type=\"radio\" name=\"nines\" value=\"yes\" />"; + echo " yes<input type=\"radio\" name=\"nines\" value=\"yes\" checked=\"checked\" />"; echo " no <input type=\"radio\" name=\"nines\" value=\"no\" /> <br />\n"; } else @@ -143,7 +203,7 @@ function check_want_to_play($me) return; } -function home_page() +function output_home_page() { ?> <p> If you want to play a game of Doppelkopf, you found the right place ;) </p> @@ -213,6 +273,8 @@ function output_header() return; } + + function output_footer() { echo "</body>\n"; |