NEW FEATURE: password recovery is now working
[e-DoKo.git] / functions.php
1 <?php
2
3 function mymail($To,$Subject,$message,$header="")
4 {  
5   global $debug;
6
7   if($debug)
8     {
9       $message = str_replace("\n","<br />\n",$message);
10       $message = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]",
11                      "<a href=\"\\0\">\\0</a>", $message);
12       
13       echo "<br />To: $To<br />";
14       if($header != "") 
15         echo $header."<br />";
16       echo "Subject: $Subject <br />$message<br />\n";
17     }
18   else
19     if($header != "")
20       mail($To,$Subject,$message,$header);
21     else
22       mail($To,$Subject,$message);
23   return;
24 }
25
26 function myisset()
27 {
28   /* returns 1 if all names passed as args are defined by a GET or POST statement,
29    * else return 0
30    */
31
32   $ok   = 1;
33   $args = func_get_args();
34   
35   foreach($args as $arg)
36     {
37       $ok = $ok * isset($_REQUEST[$arg]);
38       /*echo "$arg: ok = $ok <br />";
39        */ 
40     }
41   return $ok;
42 }
43
44 function pos_array($c,$arr)
45 {
46   $ret = 0;
47
48   $i   = 0;
49   foreach($arr as $a)
50     {
51       $i++;
52       if($a == $c)
53         {
54           $ret = $i;
55           break;
56         }
57     }
58   return $ret;
59 }
60
61 function is_trump($c) 
62
63   global $CARDS;
64
65   if(in_array($c,$CARDS["trump"]))
66     return 1;
67   else 
68     return 0;
69 }
70
71 function is_same_suite($c1,$c2) 
72 {
73   global $CARDS;
74   
75   if(in_array($c1,$CARDS["trump"]   ) && in_array($c2,$CARDS["trump"]   ) ) return 1;
76   if(in_array($c1,$CARDS["clubs"]   ) && in_array($c2,$CARDS["clubs"]   ) ) return 1;
77   if(in_array($c1,$CARDS["hearts"]  ) && in_array($c2,$CARDS["hearts"]  ) ) return 1;
78   if(in_array($c1,$CARDS["spades"]  ) && in_array($c2,$CARDS["spades"]  ) ) return 1;
79   if(in_array($c1,$CARDS["diamonds"]) && in_array($c2,$CARDS["diamonds"]) ) return 1;
80   
81   return 0;
82 }
83
84 function compare_cards($a,$b,$game)
85 {
86   /* if "a" is higher than "b" return 1, else 0, "a" being the card first played */
87
88   global $CARDS;
89   global $RULES;
90   global $GAME;
91
92   /* first map all cards to the odd number, 
93    * this insure that the first card wins the trick 
94    * if they are the same card
95    */
96   if( $a/2 - (int)($a/2) != 0.5)
97     $a--;
98   if( $b/2 - (int)($b/2) != 0.5)
99     $b--;
100
101   /* some special cases */
102   switch($game)
103     {
104     case "normal":
105     case "silent":
106       if($RULES["schweinchen"]=="both" && $GAME["schweinchen"])
107         {
108           if($a == 19 || $a == 20 )
109             return 1;
110           if($b == 19 || $b == 20 )
111             return 0;
112         };
113       if($RULES["schweinchen"]=="second" && $GAME["schweinchen"]==3)
114         {
115           if($a == 19 || $a == 20 )
116             return 1;
117           if($b == 19 || $b == 20 )
118             return 0;
119         };
120     case "trump":
121     case "heart":
122     case "spade":
123     case "club":
124       if($RULES["dullen"]=="secondwins")
125         if($a==1 && $b==1) /* both 10 of hearts */
126           return 0;        /* second one wins.*/
127     }
128   
129   /* normal case */
130   if(is_trump($a) && is_trump($b) && $a<=$b)
131     return 1;
132   else if(is_trump($a) && is_trump($b) )
133     return 0;
134   else 
135     { /*$a is not a trump */
136       if(is_trump($b))
137         return 0;
138       else
139         { /* both no trump */
140
141           /* both clubs? */
142           $posA = pos_array($a,$CARDS["clubs"]);
143           $posB = pos_array($b,$CARDS["clubs"]);
144           if($posA && $posB)
145             if($posA <= $posB)
146               return 1;
147             else
148               return 0;
149
150           /* both spades? */
151           $posA = pos_array($a,$CARDS["spades"]);
152           $posB = pos_array($b,$CARDS["spades"]);
153           if($posA && $posB)
154             if($posA <= $posB)
155               return 1;
156             else
157               return 0;
158
159           /* both hearts? */
160           $posA = pos_array($a,$CARDS["hearts"]);
161           $posB = pos_array($b,$CARDS["hearts"]);
162           if($posA && $posB)
163             if($posA <= $posB)
164               return 1;
165             else
166               return 0;
167
168           /* both diamonds? */
169           $posA = pos_array($a,$CARDS["diamonds"]);
170           $posB = pos_array($b,$CARDS["diamonds"]);
171           if($posA && $posB)
172             if($posA <= $posB)
173               return 1;
174             else
175               return 0;
176           
177           /* not the same suit and no trump: a wins */
178           return 1;
179         }         
180     }
181
182
183 function get_winner($p,$mode)
184 {
185   /* get all 4 cards played in a trick, in the order they are played */
186   $tmp = $p[1];
187   $c1    = $tmp["card"];
188   $c1pos = $tmp["pos"]; 
189
190   $tmp = $p[2];
191   $c2    = $tmp["card"];
192   $c2pos = $tmp["pos"]; 
193
194   $tmp = $p[3];
195   $c3    = $tmp["card"];
196   $c3pos = $tmp["pos"]; 
197
198   $tmp = $p[4];
199   $c4    = $tmp["card"];
200   $c4pos = $tmp["pos"]; 
201
202   /* first card is better than all the rest */
203   if( compare_cards($c1,$c2,$mode) && compare_cards($c1,$c3,$mode) && compare_cards($c1,$c4,$mode) )
204     return $c1pos; 
205
206   /* second card is better than first and better than the rest */
207   if( !compare_cards($c1,$c2,$mode) &&  compare_cards($c2,$c3,$mode) && compare_cards($c2,$c4,$mode) )
208     return $c2pos;
209
210   /* third card is better than first card and better than last */
211   if( !compare_cards($c1,$c3,$mode) &&  compare_cards($c3,$c4,$mode) )
212     /* if second card is better than first, third card needs to be even better */
213     if( !compare_cards($c1,$c2,$mode) && !compare_cards($c2,$c3,$mode) )
214       return $c3pos;
215     /* second is worse than first, e.g. not following suite */
216     else if (compare_cards($c1,$c2,$mode) )
217       return $c3pos;
218
219   /* non of the above */
220   return $c4pos;
221 }
222
223 function count_nines($cards)
224 {
225   $nines = 0;
226
227   foreach($cards as $c)
228     {
229       if($c == "25" || $c == "26") $nines++;
230       else if($c == "33" || $c == "34") $nines++;
231       else if($c == "41" || $c == "42") $nines++;
232       else if($c == "47" || $c == "48") $nines++;
233     }
234   
235   return $nines;
236 }
237
238 function check_wedding($cards)
239 {
240
241   if( in_array("3",$cards) && in_array("4",$cards) )
242     return 1;
243
244   return 0;
245 }
246
247 function count_trump($cards)
248 {
249   global $RULES;
250
251   $trump = 0;
252
253   /* count each trump */
254   foreach($cards as $c)
255     if( (int)($c) <27) 
256       $trump++;
257
258   switch($RULES["schweinchen"])
259     {
260     case "none":
261       break;
262     case "second":
263     case "secondaftercall":
264       /* add one, in case the player has both foxes (schweinchen) */
265       if( in_array("19",$cards) && in_array("20",$cards) )
266         $trump++;
267     case "both":
268       /* subtract foxes */
269       if( in_array("19",$cards))
270         $trump--;
271       if( in_array("20",$cards) )
272         $trump--;
273       break;
274     }
275
276   return $trump;
277 }
278
279 function card_to_name($card)
280 {
281   switch($card)
282     {
283       case 1:
284       case 2:
285         return "ten of hearts";
286       case 3:
287       case 4:
288       return "queen of clubs";
289       case 5:
290       case 6:
291       return "queen of spades";
292       case 7:
293       case 8:
294       return "queen of hearts";
295       case 9:
296       case 10:
297       return "queen of diamonds";
298       case 11:
299       case 12:
300       return "jack of clubs";
301       case 13:
302       case 14:
303       return "jack of spades";
304       case 15:
305       case 16:
306       return "jack of hearts";
307       case 17:
308       case 18:
309       return "jack of diamonds";
310       case 19:
311       case 20:
312       return "ace of diamonds";
313       case 21:
314       case 22:
315       return "ten of diamonds";
316       case 23:
317       case 24:
318       return "king of diamonds";
319       case 25:
320       case 26:
321       return "nine of diamonds";;
322       case 27:
323       case 28:
324       return "ace of clubs";
325       case 29:
326       case 30:
327       return "ten of clubs";
328       case 31:
329       case 32:
330       return "king of clubs";
331       case 33:
332       case 34:
333       return "nine of clubs";
334       case 35:
335       case 36:
336       return "ace of spades";
337       case 37:
338       case 38:
339       return "ten of spades";
340       case 39:
341       case 40:
342       return "king of spades";
343       case 41:
344       case 42:
345       return "nine of spades";
346       case 43:
347       case 44:
348       return "ace of hearts";
349       case 45:
350       case 46:
351       return "king of hearts";
352       case 47:
353       case 48:
354       return "nine of hearts";
355       default:
356       return "something went wrong, please contact the admin. Error: code1. $card <br />";
357     }
358 }
359
360 function card_value($card)
361 {
362   switch($card)
363     {
364     case 3:     /* clubes */     
365     case 4:                      
366     case 5:     /* spades */     
367     case 6:                      
368     case 7:     /* hearts */     
369     case 8:                      
370     case 9:     /* diamonds */   
371     case 10:                     
372       return 3;
373     case 11:    /* clubes */     
374     case 12:                     
375     case 13:    /* spades */     
376     case 14:                     
377     case 15:    /* hearts */     
378     case 16:                     
379     case 17:    /* diamonds */   
380     case 18:
381       return 2;                  
382     case 19:    /* diamonds */ 
383     case 20:                   
384     case 27:    /* clubs */    
385     case 28:                   
386     case 35:    /* spades */   
387     case 36:                   
388     case 43:    /* hearts */   
389     case 44:                   
390       return 11;
391     case 1:      /* heart */
392     case 2:
393     case 21:    /* diamonds */    
394     case 22:
395     case 29:    /* clubs */
396     case 30:
397     case 37:    /* spades */
398     case 38:
399       return 10;
400     case 23:    /* diamonds */ 
401     case 24:                   
402     case 31:    /* clubs */    
403     case 32:                   
404     case 39:    /* spades */   
405     case 40:                   
406     case 45:    /* hearts */   
407     case 46:                   
408       return 4;
409     case 25:    /* diamonds */   
410     case 26:                   
411     case 33:    /* clubs */    
412     case 34:                   
413     case 41:    /* spades */   
414     case 42:                   
415     case 47:    /* hearts */   
416     case 48:                   
417       return 0;
418     default:
419       echo "something went wrong, please contact the admin. ErrorCode: 2 - $card<br>";
420       return 0;
421     }
422 }
423
424
425 function  create_array_of_random_numbers($useridA,$useridB,$useridC,$useridD)
426 {
427   global $debug;
428
429   $r = array();
430   
431   if($debug)
432     {
433       $r[ 0]=1;     $r[12]=47;   $r[24]=13;       $r[36]=37;
434       $r[ 1]=2;     $r[13]=48;   $r[25]=14;       $r[37]=38;
435       $r[ 2]=3;     $r[14]=27;   $r[26]=15;       $r[38]=39;
436       $r[ 3]=4;     $r[15]=16;   $r[27]=28;       $r[39]=40;
437       $r[ 4]=5;     $r[16]=17;   $r[28]=29;       $r[40]=41;
438       $r[ 5]=18;    $r[17]=6;    $r[29]=30;       $r[41]=42;
439       $r[ 6]=19;    $r[18]=7;    $r[30]=31;       $r[42]=43;
440       $r[ 7]=20;    $r[19]=8;    $r[31]=32;       $r[43]=44;
441       $r[ 8]=45;    $r[20]=9;    $r[32]=21;       $r[44]=33;
442       $r[ 9]=46;    $r[21]=10;   $r[33]=22;       $r[45]=34;
443       $r[10]=35;    $r[22]=11;   $r[34]=23;       $r[46]=25;
444       $r[11]=36;    $r[23]=12;   $r[35]=24;       $r[47]=26;
445     }
446   else
447     {
448       /* check if we can find a game were non of the player was involved and return 
449        * cards insted 
450        */
451       $userstr = implode(",",array($useridA,$useridB,$useridC,$useridD));
452       $randomnumbers = DB_get_unused_randomnumbers($userstr);
453       $randomnumbers = explode(":",$randomnumbers);
454       
455       if(sizeof($randomnumbers)==48)
456         return $randomnumbers;
457       
458       /* need to create new numbers */
459       for($i=0;$i<48;$i++)
460         $r[$i]=$i+1;
461       
462       shuffle($r); 
463     };
464
465   return $r;
466 }
467
468
469
470
471 function display_cards($me,$myturn)
472 {
473   return;
474 }
475
476 function return_timezone($offset)
477 {
478   switch($offset)
479     {
480     case '1':
481       $zone = "Europe/Berlin";
482       break;
483     case '-8':
484       $zone = "America/Vancouver";
485       break;
486     case '13':
487       $zone = "Pacific/Auckland";
488       break;
489     default:
490       $zone = "Europe/London";
491     }
492   
493   return $zone;
494 }
495
496 function have_suit($cards,$c)
497 {
498   global $CARDS;
499   $suite = array();
500
501   if(in_array($c,$CARDS["trump"]))
502     $suite = $CARDS["trump"];
503   else if(in_array($c,$CARDS["clubs"]))
504     $suite = $CARDS["clubs"];
505   else if(in_array($c,$CARDS["spades"]))
506     $suite = $CARDS["spades"];
507   else if(in_array($c,$CARDS["hearts"]))
508     $suite = $CARDS["hearts"];
509   else if(in_array($c,$CARDS["diamonds"]))
510     $suite = $CARDS["diamonds"];
511
512   foreach($cards as $card)
513     {
514       if(in_array($card,$suite))
515         return 1;
516     }
517
518   return 0;
519 }
520
521 function same_type($card,$c)
522 {
523   global $CARDS;
524   $suite = "";
525
526   /* figure out what kind of card c is */
527   if(in_array($c,$CARDS["trump"]))
528     $suite = $CARDS["trump"];
529   else if(in_array($c,$CARDS["clubs"]))
530     $suite = $CARDS["clubs"];
531   else if(in_array($c,$CARDS["spades"]))
532     $suite = $CARDS["spades"];
533   else if(in_array($c,$CARDS["hearts"]))
534     $suite = $CARDS["hearts"];
535   else if(in_array($c,$CARDS["diamonds"]))
536     $suite = $CARDS["diamonds"];
537
538   /* card is the same suid return 1 */ 
539   if(in_array($card,$suite))
540     return 1;
541   
542   return 0;
543 }
544
545 function set_gametype($gametype)
546 {
547   global $CARDS;
548   global $RULES;
549
550   switch($gametype)
551     {
552     case "normal":
553     case "wedding":
554     case "poverty":
555     case "dpoverty":
556     case "trump":
557     case "silent":
558       $CARDS["trump"]    = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
559                                  '17','18','19','20','21','22','23','24','25','26');
560       $CARDS["diamonds"] = array();
561       $CARDS["clubs"]    = array('27','28','29','30','31','32','33','34');
562       $CARDS["spades"]   = array('35','36','37','38','39','40','41','42');
563       $CARDS["hearts"]   = array('43','44','45','46','47','48');
564       $CARDS["foxes"]    = array('19','20');
565       if($RULES["dullen"]=='none')
566         {
567           $CARDS["trump"]    = array('3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
568                                      '17','18','19','20','21','22','23','24','25','26');
569           $CARDS["hearts"]   = array('43','44','1','2','45','46','47','48');
570         }
571       break;
572     case "queen":
573       $CARDS["trump"]    = array('3','4','5','6','7','8','9','10');
574       $CARDS["clubs"]    = array('27','28','29','30','31','32','11','12','33','34');
575       $CARDS["spades"]   = array('35','36','37','38','39','40','13','14','41','42');
576       $CARDS["hearts"]   = array('43','44', '1', '2','45','46','15','16','47','48');
577       $CARDS["diamonds"] = array('19','20','21','22','23','24','17','18','25','26');
578       $CARDS["foxes"]    = array();
579       break;
580     case "jack":
581       $CARDS["trump"]    = array('11','12','13','14','15','16','17','18');
582       $CARDS["clubs"]    = array('27','28','29','30','31','32','3', '4','33','34');
583       $CARDS["spades"]   = array('35','36','37','38','39','40','5', '6','41','42');
584       $CARDS["hearts"]   = array('43','44', '1', '2','45','46','7', '8','47','48');
585       $CARDS["diamonds"] = array('19','20','21','22','23','24','9','10','25','26');
586       $CARDS["foxes"]    = array();
587       break;
588     case "trumpless":
589       $CARDS["trump"]    = array();
590       $CARDS["clubs"]    = array('27','28','29','30','31','32','3', '4','11','12','33','34');
591       $CARDS["spades"]   = array('35','36','37','38','39','40','5', '6','13','14','41','42');
592       $CARDS["hearts"]   = array('43','44', '1', '2','45','46','7', '8','15','16','47','48');
593       $CARDS["diamonds"] = array('19','20','21','22','23','24','9','10','17','18','25','26');
594       $CARDS["foxes"]    = array();
595       break;
596     case "club":
597       $CARDS["trump"]    = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
598                                  '17','18','27','28','29','30','31','32','33','34');
599       $CARDS["clubs"]    = array();
600       $CARDS["spades"]   = array('35','36','37','38','39','40','41','42');
601       $CARDS["hearts"]   = array('43','44','45','46','47','48');
602       $CARDS["diamonds"] = array('19','20','21','22','23','24','25','26');
603       $CARDS["foxes"]    = array();
604       if($RULES["dullen"]=='none')
605         {
606           $CARDS["trump"]    = array('3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
607                                      '17','18','27','28','29','30','31','32','33','34');
608           $CARDS["hearts"]   = array('43','44','1','2','45','46','47','48');
609         }
610       break;
611     case "spade":
612       $CARDS["trump"]    = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
613                                  '17','18','35','36','37','38','39','40','41','42');
614       $CARDS["clubs"]    = array('27','28','29','30','31','32','33','34');
615       $CARDS["spades"]   = array();
616       $CARDS["hearts"]   = array('43','44','45','46','47','48');
617       $CARDS["diamonds"] = array('19','20','21','22','23','24','25','26');
618       $CARDS["foxes"]    = array();
619       if($RULES["dullen"]=='none')
620         {
621           $CARDS["trump"]    = array('3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
622                                      '17','18','35','36','37','38','39','40','41','42');
623           $CARDS["hearts"]   = array('43','44','1','2','45','46','47','48');
624         }
625       break;
626     case "heart":
627       $CARDS["trump"]    = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
628                                  '17','18','43','44','45','46','47','48');
629       $CARDS["clubs"]    = array('27','28','29','30','31','32','33','34');
630       $CARDS["spades"]   = array('35','36','37','38','39','40','41','42');
631       $CARDS["hearts"]   = array();
632       $CARDS["diamonds"] = array('19','20','21','22','23','24','25','26');
633       $CARDS["foxes"]    = array();
634       if($RULES["dullen"]=='none')
635         {
636           $CARDS["trump"]    = array('3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
637                             '17','18','43','44','1','2','45','46','47','48');
638         }
639       break;
640     }
641 }
642
643 function mysort($cards,$gametype)
644 {
645   usort ( $cards, "sort_comp" );
646   return $cards;
647 }
648
649 function sort_comp($a,$b)
650 {
651   global $CARDS;
652
653   $ALL = array();
654   $ALL = array_merge($CARDS["trump"],$CARDS["diamonds"],$CARDS["clubs"],
655                      $CARDS["hearts"],$CARDS["spades"],$CARDS["diamonds"]);
656
657   return pos_array($a,$ALL)-pos_array($b,$ALL);
658 }
659
660 function can_call($what,$hash)
661 {
662   global $RULES;
663
664   /*TODO: check if this already has been call by teammate */
665   
666   $gameid   = DB_get_gameid_by_hash($hash);
667   $gametype = DB_get_gametype_by_gameid($gameid);
668
669   $NRcards  = count(DB_get_hand($hash));
670   
671   $NRallcards = 0;
672   for ($i=1;$i<5;$i++)
673     {
674       $user         = DB_get_hash_from_game_and_pos($gameid,$i);
675       $NRallcards  += count(DB_get_hand($user));
676     };
677   
678   /* in case of a wedding, everything will be delayed by an offset */
679   $offset = 0;
680   if($gametype=="wedding")
681     {
682       $offset = DB_get_sickness_by_gameid($gameid); 
683       if ($offset <0) /* not resolved */
684         return 0;
685     };
686
687   switch ($RULES["call"])
688     {
689     case "1st-own-card":
690       if( 4-($what/30) >= 12 - ($NRcards + $offset))
691         return 1;
692       break;
693     case "5th-card":
694       if( 27+4*($what/30) <= $NRallcards + $offset*4)
695         return 1;
696       break;
697     case "9-cards":
698       if( ($what/10) <= $NRcards + $offset)
699         return 1;
700       break;
701     }
702
703   return 0;
704 }
705
706 ?>