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