feature: added link to game in final email, CC'ed people in final email
[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()
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       for($i=0;$i<48;$i++)
450         $r[$i]=$i+1;
451       
452       shuffle($r);
453     };
454
455   return $r;
456 }
457
458
459
460
461 function display_cards($me,$myturn)
462 {
463   return;
464 }
465
466 function return_timezone($offset)
467 {
468   switch($offset)
469     {
470     case '1':
471       $zone = "Europe/Berlin";
472       break;
473     case '-8':
474       $zone = "America/Vancouver";
475       break;
476     case '13':
477       $zone = "Pacific/Auckland";
478       break;
479     default:
480       $zone = "Europe/London";
481     }
482   
483   return $zone;
484 }
485
486 function have_suit($cards,$c)
487 {
488   global $CARDS;
489   $suite = array();
490
491   if(in_array($c,$CARDS["trump"]))
492     $suite = $CARDS["trump"];
493   else if(in_array($c,$CARDS["clubs"]))
494     $suite = $CARDS["clubs"];
495   else if(in_array($c,$CARDS["spades"]))
496     $suite = $CARDS["spades"];
497   else if(in_array($c,$CARDS["hearts"]))
498     $suite = $CARDS["hearts"];
499   else if(in_array($c,$CARDS["diamonds"]))
500     $suite = $CARDS["diamonds"];
501
502   foreach($cards as $card)
503     {
504       if(in_array($card,$suite))
505         return 1;
506     }
507
508   return 0;
509 }
510
511 function same_type($card,$c)
512 {
513   global $CARDS;
514   $suite = "";
515
516   /* figure out what kind of card c is */
517   if(in_array($c,$CARDS["trump"]))
518     $suite = $CARDS["trump"];
519   else if(in_array($c,$CARDS["clubs"]))
520     $suite = $CARDS["clubs"];
521   else if(in_array($c,$CARDS["spades"]))
522     $suite = $CARDS["spades"];
523   else if(in_array($c,$CARDS["hearts"]))
524     $suite = $CARDS["hearts"];
525   else if(in_array($c,$CARDS["diamonds"]))
526     $suite = $CARDS["diamonds"];
527
528   /* card is the same suid return 1 */ 
529   if(in_array($card,$suite))
530     return 1;
531   
532   return 0;
533 }
534
535 function set_gametype($gametype)
536 {
537   global $CARDS;
538   global $RULES;
539
540   switch($gametype)
541     {
542     case "normal":
543     case "wedding":
544     case "poverty":
545     case "dpoverty":
546     case "trump":
547     case "silent":
548       $CARDS["trump"]    = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
549                                  '17','18','19','20','21','22','23','24','25','26');
550       $CARDS["diamonds"] = array();
551       $CARDS["clubs"]    = array('27','28','29','30','31','32','33','34');
552       $CARDS["spades"]   = array('35','36','37','38','39','40','41','42');
553       $CARDS["hearts"]   = array('43','44','45','46','47','48');
554       $CARDS["foxes"]    = array('19','20');
555       if($RULES["dullen"]=='none')
556         {
557           $CARDS["trump"]    = array('3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
558                                      '17','18','19','20','21','22','23','24','25','26');
559           $CARDS["hearts"]   = array('43','44','1','2','45','46','47','48');
560         }
561       break;
562     case "queen":
563       $CARDS["trump"]    = array('3','4','5','6','7','8','9','10');
564       $CARDS["clubs"]    = array('27','28','29','30','31','32','11','12','33','34');
565       $CARDS["spades"]   = array('35','36','37','38','39','40','13','14','41','42');
566       $CARDS["hearts"]   = array('43','44', '1', '2','45','46','15','16','47','48');
567       $CARDS["diamonds"] = array('19','20','21','22','23','24','17','18','25','26');
568       $CARDS["foxes"]    = array();
569       break;
570     case "jack":
571       $CARDS["trump"]    = array('11','12','13','14','15','16','17','18');
572       $CARDS["clubs"]    = array('27','28','29','30','31','32','3', '4','33','34');
573       $CARDS["spades"]   = array('35','36','37','38','39','40','5', '6','41','42');
574       $CARDS["hearts"]   = array('43','44', '1', '2','45','46','7', '8','47','48');
575       $CARDS["diamonds"] = array('19','20','21','22','23','24','9','10','25','26');
576       $CARDS["foxes"]    = array();
577       break;
578     case "trumpless":
579       $CARDS["trump"]    = array();
580       $CARDS["clubs"]    = array('27','28','29','30','31','32','3', '4','11','12','33','34');
581       $CARDS["spades"]   = array('35','36','37','38','39','40','5', '6','13','14','41','42');
582       $CARDS["hearts"]   = array('43','44', '1', '2','45','46','7', '8','15','16','47','48');
583       $CARDS["diamonds"] = array('19','20','21','22','23','24','9','10','17','18','25','26');
584       $CARDS["foxes"]    = array();
585       break;
586     case "club":
587       $CARDS["trump"]    = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
588                                  '17','18','27','28','29','30','31','32','33','34');
589       $CARDS["clubs"]    = array();
590       $CARDS["spades"]   = array('35','36','37','38','39','40','41','42');
591       $CARDS["hearts"]   = array('43','44','45','46','47','48');
592       $CARDS["diamonds"] = array('19','20','21','22','23','24','25','26');
593       $CARDS["foxes"]    = array();
594       if($RULES["dullen"]=='none')
595         {
596           $CARDS["trump"]    = array('3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
597                                      '17','18','27','28','29','30','31','32','33','34');
598           $CARDS["hearts"]   = array('43','44','1','2','45','46','47','48');
599         }
600       break;
601     case "spade":
602       $CARDS["trump"]    = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
603                                  '17','18','35','36','37','38','39','40','41','42');
604       $CARDS["clubs"]    = array('27','28','29','30','31','32','33','34');
605       $CARDS["spades"]   = array();
606       $CARDS["hearts"]   = array('43','44','45','46','47','48');
607       $CARDS["diamonds"] = array('19','20','21','22','23','24','25','26');
608       $CARDS["foxes"]    = array();
609       if($RULES["dullen"]=='none')
610         {
611           $CARDS["trump"]    = array('3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
612                                      '17','18','35','36','37','38','39','40','41','42');
613           $CARDS["hearts"]   = array('43','44','1','2','45','46','47','48');
614         }
615       break;
616     case "heart":
617       $CARDS["trump"]    = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
618                                  '17','18','43','44','45','46','47','48');
619       $CARDS["clubs"]    = array('27','28','29','30','31','32','33','34');
620       $CARDS["spades"]   = array('35','36','37','38','39','40','41','42');
621       $CARDS["hearts"]   = array();
622       $CARDS["diamonds"] = array('19','20','21','22','23','24','25','26');
623       $CARDS["foxes"]    = array();
624       if($RULES["dullen"]=='none')
625         {
626           $CARDS["trump"]    = array('3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
627                             '17','18','43','44','1','2','45','46','47','48');
628         }
629       break;
630     }
631 }
632
633 function mysort($cards,$gametype)
634 {
635   usort ( $cards, "sort_comp" );
636   return $cards;
637 }
638
639 function sort_comp($a,$b)
640 {
641   global $CARDS;
642
643   $ALL = array();
644   $ALL = array_merge($CARDS["trump"],$CARDS["diamonds"],$CARDS["clubs"],
645                      $CARDS["hearts"],$CARDS["spades"],$CARDS["diamonds"]);
646
647   return pos_array($a,$ALL)-pos_array($b,$ALL);
648 }
649
650 function can_call($what,$hash)
651 {
652   return 1;
653 }
654
655 ?>