CLEANUP: get card names from the database
[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_value($card)
280 {
281   switch($card)
282     {
283     case 3:     /* clubes */     
284     case 4:                      
285     case 5:     /* spades */     
286     case 6:                      
287     case 7:     /* hearts */     
288     case 8:                      
289     case 9:     /* diamonds */   
290     case 10:                     
291       return 3;
292     case 11:    /* clubes */     
293     case 12:                     
294     case 13:    /* spades */     
295     case 14:                     
296     case 15:    /* hearts */     
297     case 16:                     
298     case 17:    /* diamonds */   
299     case 18:
300       return 2;                  
301     case 19:    /* diamonds */ 
302     case 20:                   
303     case 27:    /* clubs */    
304     case 28:                   
305     case 35:    /* spades */   
306     case 36:                   
307     case 43:    /* hearts */   
308     case 44:                   
309       return 11;
310     case 1:      /* heart */
311     case 2:
312     case 21:    /* diamonds */    
313     case 22:
314     case 29:    /* clubs */
315     case 30:
316     case 37:    /* spades */
317     case 38:
318       return 10;
319     case 23:    /* diamonds */ 
320     case 24:                   
321     case 31:    /* clubs */    
322     case 32:                   
323     case 39:    /* spades */   
324     case 40:                   
325     case 45:    /* hearts */   
326     case 46:                   
327       return 4;
328     case 25:    /* diamonds */   
329     case 26:                   
330     case 33:    /* clubs */    
331     case 34:                   
332     case 41:    /* spades */   
333     case 42:                   
334     case 47:    /* hearts */   
335     case 48:                   
336       return 0;
337     default:
338       echo "something went wrong, please contact the admin. ErrorCode: 2 - $card<br>";
339       return 0;
340     }
341 }
342
343
344 function  create_array_of_random_numbers($useridA,$useridB,$useridC,$useridD)
345 {
346   global $debug;
347
348   $r = array();
349   
350   if($debug)
351     {
352       $r[ 0]=1;     $r[12]=47;   $r[24]=13;       $r[36]=37;
353       $r[ 1]=2;     $r[13]=48;   $r[25]=14;       $r[37]=38;
354       $r[ 2]=3;     $r[14]=27;   $r[26]=15;       $r[38]=39;
355       $r[ 3]=4;     $r[15]=16;   $r[27]=28;       $r[39]=40;
356       $r[ 4]=5;     $r[16]=17;   $r[28]=29;       $r[40]=41;
357       $r[ 5]=18;    $r[17]=6;    $r[29]=30;       $r[41]=42;
358       $r[ 6]=19;    $r[18]=7;    $r[30]=31;       $r[42]=43;
359       $r[ 7]=20;    $r[19]=8;    $r[31]=32;       $r[43]=44;
360       $r[ 8]=45;    $r[20]=9;    $r[32]=21;       $r[44]=33;
361       $r[ 9]=46;    $r[21]=10;   $r[33]=22;       $r[45]=34;
362       $r[10]=35;    $r[22]=11;   $r[34]=23;       $r[46]=25;
363       $r[11]=36;    $r[23]=12;   $r[35]=24;       $r[47]=26;
364     }
365   else
366     {
367       /* check if we can find a game were non of the player was involved and return 
368        * cards insted 
369        */
370       $userstr = implode(",",array($useridA,$useridB,$useridC,$useridD));
371       $randomnumbers = DB_get_unused_randomnumbers($userstr);
372       $randomnumbers = explode(":",$randomnumbers);
373       
374       if(sizeof($randomnumbers)==48)
375         return $randomnumbers;
376       
377       /* need to create new numbers */
378       for($i=0;$i<48;$i++)
379         $r[$i]=$i+1;
380       
381       shuffle($r); 
382     };
383
384   return $r;
385 }
386
387
388
389
390 function display_cards($me,$myturn)
391 {
392   return;
393 }
394
395 function return_timezone($offset)
396 {
397   switch($offset)
398     {
399     case '1':
400       $zone = "Europe/Berlin";
401       break;
402     case '-8':
403       $zone = "America/Vancouver";
404       break;
405     case '13':
406       $zone = "Pacific/Auckland";
407       break;
408     default:
409       $zone = "Europe/London";
410     }
411   
412   return $zone;
413 }
414
415 function have_suit($cards,$c)
416 {
417   global $CARDS;
418   $suite = array();
419
420   if(in_array($c,$CARDS["trump"]))
421     $suite = $CARDS["trump"];
422   else if(in_array($c,$CARDS["clubs"]))
423     $suite = $CARDS["clubs"];
424   else if(in_array($c,$CARDS["spades"]))
425     $suite = $CARDS["spades"];
426   else if(in_array($c,$CARDS["hearts"]))
427     $suite = $CARDS["hearts"];
428   else if(in_array($c,$CARDS["diamonds"]))
429     $suite = $CARDS["diamonds"];
430
431   foreach($cards as $card)
432     {
433       if(in_array($card,$suite))
434         return 1;
435     }
436
437   return 0;
438 }
439
440 function same_type($card,$c)
441 {
442   global $CARDS;
443   $suite = "";
444
445   /* figure out what kind of card c is */
446   if(in_array($c,$CARDS["trump"]))
447     $suite = $CARDS["trump"];
448   else if(in_array($c,$CARDS["clubs"]))
449     $suite = $CARDS["clubs"];
450   else if(in_array($c,$CARDS["spades"]))
451     $suite = $CARDS["spades"];
452   else if(in_array($c,$CARDS["hearts"]))
453     $suite = $CARDS["hearts"];
454   else if(in_array($c,$CARDS["diamonds"]))
455     $suite = $CARDS["diamonds"];
456
457   /* card is the same suid return 1 */ 
458   if(in_array($card,$suite))
459     return 1;
460   
461   return 0;
462 }
463
464 function set_gametype($gametype)
465 {
466   global $CARDS;
467   global $RULES;
468
469   switch($gametype)
470     {
471     case "normal":
472     case "wedding":
473     case "poverty":
474     case "dpoverty":
475     case "trump":
476     case "silent":
477       $CARDS["trump"]    = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
478                                  '17','18','19','20','21','22','23','24','25','26');
479       $CARDS["diamonds"] = array();
480       $CARDS["clubs"]    = array('27','28','29','30','31','32','33','34');
481       $CARDS["spades"]   = array('35','36','37','38','39','40','41','42');
482       $CARDS["hearts"]   = array('43','44','45','46','47','48');
483       $CARDS["foxes"]    = array('19','20');
484       if($RULES["dullen"]=='none')
485         {
486           $CARDS["trump"]    = array('3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
487                                      '17','18','19','20','21','22','23','24','25','26');
488           $CARDS["hearts"]   = array('43','44','1','2','45','46','47','48');
489         }
490       break;
491     case "queen":
492       $CARDS["trump"]    = array('3','4','5','6','7','8','9','10');
493       $CARDS["clubs"]    = array('27','28','29','30','31','32','11','12','33','34');
494       $CARDS["spades"]   = array('35','36','37','38','39','40','13','14','41','42');
495       $CARDS["hearts"]   = array('43','44', '1', '2','45','46','15','16','47','48');
496       $CARDS["diamonds"] = array('19','20','21','22','23','24','17','18','25','26');
497       $CARDS["foxes"]    = array();
498       break;
499     case "jack":
500       $CARDS["trump"]    = array('11','12','13','14','15','16','17','18');
501       $CARDS["clubs"]    = array('27','28','29','30','31','32','3', '4','33','34');
502       $CARDS["spades"]   = array('35','36','37','38','39','40','5', '6','41','42');
503       $CARDS["hearts"]   = array('43','44', '1', '2','45','46','7', '8','47','48');
504       $CARDS["diamonds"] = array('19','20','21','22','23','24','9','10','25','26');
505       $CARDS["foxes"]    = array();
506       break;
507     case "trumpless":
508       $CARDS["trump"]    = array();
509       $CARDS["clubs"]    = array('27','28','29','30','31','32','3', '4','11','12','33','34');
510       $CARDS["spades"]   = array('35','36','37','38','39','40','5', '6','13','14','41','42');
511       $CARDS["hearts"]   = array('43','44', '1', '2','45','46','7', '8','15','16','47','48');
512       $CARDS["diamonds"] = array('19','20','21','22','23','24','9','10','17','18','25','26');
513       $CARDS["foxes"]    = array();
514       break;
515     case "club":
516       $CARDS["trump"]    = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
517                                  '17','18','27','28','29','30','31','32','33','34');
518       $CARDS["clubs"]    = array();
519       $CARDS["spades"]   = array('35','36','37','38','39','40','41','42');
520       $CARDS["hearts"]   = array('43','44','45','46','47','48');
521       $CARDS["diamonds"] = array('19','20','21','22','23','24','25','26');
522       $CARDS["foxes"]    = array();
523       if($RULES["dullen"]=='none')
524         {
525           $CARDS["trump"]    = array('3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
526                                      '17','18','27','28','29','30','31','32','33','34');
527           $CARDS["hearts"]   = array('43','44','1','2','45','46','47','48');
528         }
529       break;
530     case "spade":
531       $CARDS["trump"]    = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
532                                  '17','18','35','36','37','38','39','40','41','42');
533       $CARDS["clubs"]    = array('27','28','29','30','31','32','33','34');
534       $CARDS["spades"]   = array();
535       $CARDS["hearts"]   = array('43','44','45','46','47','48');
536       $CARDS["diamonds"] = array('19','20','21','22','23','24','25','26');
537       $CARDS["foxes"]    = array();
538       if($RULES["dullen"]=='none')
539         {
540           $CARDS["trump"]    = array('3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
541                                      '17','18','35','36','37','38','39','40','41','42');
542           $CARDS["hearts"]   = array('43','44','1','2','45','46','47','48');
543         }
544       break;
545     case "heart":
546       $CARDS["trump"]    = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
547                                  '17','18','43','44','45','46','47','48');
548       $CARDS["clubs"]    = array('27','28','29','30','31','32','33','34');
549       $CARDS["spades"]   = array('35','36','37','38','39','40','41','42');
550       $CARDS["hearts"]   = array();
551       $CARDS["diamonds"] = array('19','20','21','22','23','24','25','26');
552       $CARDS["foxes"]    = array();
553       if($RULES["dullen"]=='none')
554         {
555           $CARDS["trump"]    = array('3','4','5','6','7','8','9','10','11','12','13','14','15','16', 
556                             '17','18','43','44','1','2','45','46','47','48');
557         }
558       break;
559     }
560 }
561
562 function mysort($cards,$gametype)
563 {
564   usort ( $cards, "sort_comp" );
565   return $cards;
566 }
567
568 function sort_comp($a,$b)
569 {
570   global $CARDS;
571
572   $ALL = array();
573   $ALL = array_merge($CARDS["trump"],$CARDS["diamonds"],$CARDS["clubs"],
574                      $CARDS["hearts"],$CARDS["spades"],$CARDS["diamonds"]);
575
576   return pos_array($a,$ALL)-pos_array($b,$ALL);
577 }
578
579 function can_call($what,$hash)
580 {
581   global $RULES;
582
583   /*TODO: check if this already has been call by teammate */
584   
585   $gameid   = DB_get_gameid_by_hash($hash);
586   $gametype = DB_get_gametype_by_gameid($gameid);
587
588   $NRcards  = count(DB_get_hand($hash));
589   
590   $NRallcards = 0;
591   for ($i=1;$i<5;$i++)
592     {
593       $user         = DB_get_hash_from_game_and_pos($gameid,$i);
594       $NRallcards  += count(DB_get_hand($user));
595     };
596   
597   /* in case of a wedding, everything will be delayed by an offset */
598   $offset = 0;
599   if($gametype=="wedding")
600     {
601       $offset = DB_get_sickness_by_gameid($gameid); 
602       if ($offset <0) /* not resolved */
603         return 0;
604     };
605
606   switch ($RULES["call"])
607     {
608     case "1st-own-card":
609       if( 4-($what/30) >= 12 - ($NRcards + $offset))
610         return 1;
611       break;
612     case "5th-card":
613       if( 27+4*($what/30) <= $NRallcards + $offset*4)
614         return 1;
615       break;
616     case "9-cards":
617       if( ($what/10) <= $NRcards + $offset)
618         return 1;
619       break;
620     }
621
622   return 0;
623 }
624
625 ?>