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