1 
2 /*
3     xskat - a card game for 1 to 3 players.
4     Copyright (C) 2004  Gunter Gerhardt
5 
6     This program is free software; you can redistribute it freely.
7     Use it at your own risk; there is NO WARRANTY.
8 
9     Redistribution of modified versions is permitted
10     provided that the following conditions are met:
11     1. All copyright & permission notices are preserved.
12     2.a) Only changes required for packaging or porting are made.
13       or
14     2.b) It is clearly stated who last changed the program.
15          The program is renamed or
16          the version number is of the form x.y.z,
17          where x.y is the version of the original program
18          and z is an arbitrary suffix.
19 
20 */
21 
22 #define SKAT_C
23 
24 #include <stdlib.h>
25 #include <stdio.h>
26 #include <string.h>
27 #include <ctype.h>
28 #include <time.h>
29 #include "defs.h"
30 #include "skat.h"
31 #include "text.h"
32 
left(s)33 int left(s)
34 int s;
35 {
36   return (s+1)%3;
37 }
38 
right(s)39 int right(s)
40 int s;
41 {
42   return (s+2)%3;
43 }
44 
iscomp(s)45 int iscomp(s)
46 int s;
47 {
48   return s>=numsp;
49 }
50 
swap(i,j)51 VOID swap(i,j)
52 int *i,*j;
53 {
54   int h;
55 
56   h=*i;
57   *i=*j;
58   *j=h;
59 }
60 
setrnd(s,v)61 VOID setrnd(s,v)
62 long *s,v;
63 {
64   *s=v<<1?v:-1;
65 }
66 
rndval(s,m)67 int rndval(s,m)
68 long *s;
69 int m;
70 {
71   register long h=*s;
72   int i;
73 
74   for (i=0;i<7;i++) h=(h<<16)|((((h<<1)^(h<<4))>>16)&0xffff);
75   *s=h;
76   return h&m;
77 }
78 
rnd(m)79 int rnd(m)
80 int m;
81 {
82   return rndval(&seed[1],m);
83 }
84 
synerr(f,s)85 VOID synerr(f,s)
86 FILE *f;
87 char *s;
88 {
89   int c,l,n;
90 
91   fprintf(stderr,"Error in file %s",game_file);
92   if (feof(f)) fputs(": unexpected EOF\n",stderr);
93   else {
94     fprintf(stderr," reading: '%s'\n",s);
95     fputs("before:\n",stderr);
96     l=3;
97     n=200;
98     while (l && n) {
99       if ((c=fgetc(f))==EOF) l=0;
100       else {
101 	if (c=='\n') l--;
102 	n--;
103 	fputc(c,stderr);
104       }
105     }
106   }
107   fclose(f);
108   game_file=0;
109 }
110 
get_game()111 int get_game()
112 {
113   static int opened;
114   static FILE *f;
115   char s[100],*p;
116   int i,n,cpos[4],cmax[4],state,rep;
117   long num;
118 
119   if (predef==1) predef=0;
120   if (!game_file) return 0;
121   if (!opened) {
122     if (!strcmp(game_file,"-")) {
123       game_file="stdin";
124       f=stdin;
125     }
126     else {
127       f=fopen(game_file,"r");
128     }
129     if (!f) {
130       fprintf(stderr,"Can't open file %s\n",game_file);
131       exitus(1);
132     }
133     opened=1;
134   }
135   state=rep=n=0;
136   while (state!=4) {
137     if (fscanf(f," %99s",s)!=1) {
138       if (!state) break;
139       synerr(f,"");
140       return 0;
141     }
142     else if (*s=='#') {
143       do {
144 	fgets(s,99,f);
145       } while (s[strlen(s)-1]!='\n' && s[0]);
146     }
147     else if (!strcmp(s,"random_seed")) {
148       if (!state) state=2;
149       else {
150 	synerr(f,s);
151 	return 0;
152       }
153     }
154     else if (!strcmp(s,"repeat")) {
155       if (!state) {
156 	if (rep) break;
157 	rewind(f);
158 	rep=1;
159       }
160       else {
161 	synerr(f,s);
162 	return 0;
163       }
164     }
165     else {
166       num=strtol(s,&p,10);
167       if (p!=s+strlen(s)) {
168 	synerr(f,s);
169 	return 0;
170       }
171       switch (state) {
172       case 0:
173 	cpos[0]=30;cmax[0]=2;
174 	cpos[1]=sager*10;cmax[1]=10;
175 	cpos[2]=geber*10;cmax[2]=10;
176 	cpos[3]=hoerer*10;cmax[3]=10;
177 	state=1;
178       case 1:
179 	if (num<0 || num>3 || !cmax[num]) {
180 	  synerr(f,s);
181 	  return 0;
182 	}
183 	cards[cpos[num]]=n;
184 	cpos[num]++;
185 	cmax[num]--;
186 	n++;
187 	if (n==32) {
188 	  predef=1;
189 	  return 1;
190 	}
191 	break;
192       case 2:
193 	predef=2;
194 	setrnd(&seed[0],savseed=num);
195 	state=3;
196 	break;
197       case 3:
198 	gamenr=num;
199 	while (num-->0) {
200 	  for (i=0;i<32;i++) rndval(&seed[0],0);
201 	}
202 	if (fscanf(f," %d",&i)==1) {
203 	  if (i>=1 && i<=3) {
204 	    geber=i-1;
205 	    hoerer=ausspl=left(geber);
206 	    sager=right(geber);
207 	  }
208 	}
209 	if (fscanf(f," %99s",s)==1) {
210 	  if (toupper(*s)=='L') rotateby=-1;
211 	  else if (toupper(*s)=='R') rotateby=1;
212 	}
213 	state=4;
214 	break;
215       }
216     }
217   }
218   fclose(f);
219   game_file=0;
220   return 0;
221 }
222 
gutesblatt()223 int gutesblatt()
224 {
225   int i,c,tr,bb,bs,as,ze;
226   int t[4];
227 
228   t[0]=t[1]=t[2]=t[3]=0;
229   bb=bs=as=ze=0;
230   for (i=0;i<12;i++) {
231     c=cards[i<10?i:20+i];
232     if ((c&7)==BUBE) {
233       bb++;
234       if (i>9) bs++;
235     }
236     else t[c>>3]++;
237   }
238   tr=0;
239   for (i=1;i<4;i++) {
240     if (t[i]>=t[tr]) tr=i;
241   }
242   for (i=0;i<12;i++) {
243     c=cards[i<10?i:20+i];
244     if ((c&7)!=BUBE && c>>3!=tr) {
245       switch (c&7) {
246       case AS:as++;break;
247       case ZEHN:ze++;break;
248       }
249     }
250   }
251   tr+=bb;
252   return (tr>5 ||
253 	  (tr==5 && as+ze>1) ||
254 	  (bb>2 && as>1)) && bs;
255 }
256 
mischen()257 VOID mischen()
258 {
259   int i,j;
260   static int savecards[32];
261 
262   if (wieder) {
263     for (i=0;i<32;i++) cards[i]=savecards[i];
264     if (wieder==1) {
265       if (vorhandwn) rotateby=(rotateby+3)%3-1;
266       for (i=0;i<10;i++) swap(&cards[i],&cards[10+i]);
267       for (i=0;i<10;i++) swap(&cards[10+i],&cards[20+i]);
268     }
269     else if (wieder==3) {
270       if (vorhandwn) rotateby=(rotateby+2)%3-1;
271       for (i=0;i<10;i++) swap(&cards[i],&cards[20+i]);
272       for (i=0;i<10;i++) swap(&cards[20+i],&cards[10+i]);
273     }
274     wieder=0;
275   }
276   else if (!get_game()) {
277     do {
278       for (i=0;i<32;i++) cards[i]=i;
279       for (i=0;i<32;i++) swap(&cards[i],&cards[rndval(&seed[0],31)]);
280       for (i=0;i<10;i++) swap(&cards[geber*10+i],&cards[i]);
281       for (i=0;i<10;i++) swap(&cards[hoerer*10+i],&cards[geber==1?i:10+i]);
282       if (rotateby<0) {
283 	for (i=0;i<10;i++) swap(&cards[i],&cards[10+i]);
284 	for (i=0;i<10;i++) swap(&cards[10+i],&cards[20+i]);
285       }
286       else if (rotateby>0) {
287 	for (i=0;i<10;i++) swap(&cards[i],&cards[20+i]);
288 	for (i=0;i<10;i++) swap(&cards[20+i],&cards[10+i]);
289       }
290       gamenr++;
291     } while ((pkoption==1 || pkoption==4) && numsp==1 && !gutesblatt());
292     if (pkoption>1) pkoption=0;
293   }
294   for (i=0;i<32;i++) savecards[i]=cards[i];
295   setrnd(&seed[1],seed[0]);
296   for (i=0;i<32;i++) gespcd[i]=0;
297   for (i=0;i<4;i++) gespfb[i]=0;
298   butternok=0;
299   for (i=0;i<3;i++) {
300     for (j=0;j<5;j++) hatnfb[i][j]=0;
301   }
302   gstsum=0;
303   astsum=0;
304 }
305 
lower(c1,c2,n)306 int lower(c1,c2,n)
307 int c1,c2,n;
308 {
309   int f1,f2,w1,w2;
310 
311   if (c1<0) return 1;
312   if (c2<0) return 0;
313   f1=c1>>3;
314   f2=c2>>3;
315   w1=c1&7;
316   w2=c2&7;
317   if (n) {
318     if (sortw[f1]<sortw[f2]) return 1;
319     if (sortw[f1]>sortw[f2]) return 0;
320     if (w1==ZEHN) return w2<=BUBE;
321     if (w2==ZEHN) return w1>BUBE;
322     return w1>w2;
323   }
324   if (w2==BUBE) {
325     if (w1!=BUBE) return 1;
326     return f1<f2;
327   }
328   else {
329     if (w1==BUBE) return 0;
330     if (f2==trumpf && f1!=trumpf) return 1;
331     if (f1==trumpf && f2!=trumpf) return 0;
332     if (sortw[f1]<sortw[f2]) return 1;
333     if (sortw[f1]>sortw[f2]) return 0;
334     return w1>w2;
335   }
336 }
337 
sort(sn)338 VOID sort(sn)
339 int sn;
340 {
341   int i,j,f=sn*10;
342   int hatfb[4],fbsum,firstf,sptz;
343 
344   sortw[0]=0;
345   sortw[1]=1;
346   sortw[2]=2;
347   sortw[3]=3;
348   if (alternate[sn]) {
349     hatfb[0]=hatfb[1]=hatfb[2]=hatfb[3]=0;
350     for (i=f;i<f+10;i++) {
351       if (cards[i]>=0 && ((cards[i]&7)!=BUBE || sort2[sn])) {
352         hatfb[cards[i]>>3]=1;
353       }
354     }
355     if (!sort2[sn] && trumpf>=0 && trumpf<4 && hatfb[trumpf]) {
356       hatfb[trumpf]=0;
357       firstf=trumpf;
358     }
359     else firstf=-1;
360     fbsum=hatfb[0]+hatfb[1]+hatfb[2]+hatfb[3];
361     if ((hatfb[0] || hatfb[1]) && (hatfb[2] || hatfb[3])) {
362       switch (fbsum) {
363       case 4:
364         sortw[1]=2;
365         sortw[2]=1;
366         break;
367       case 3:
368         if (hatfb[0] && hatfb[1]) {
369           sortw[0]=0;
370           sortw[1]=2;
371           sortw[2]=sortw[3]=1;
372         }
373         else {
374           sortw[2]=0;
375           sortw[3]=2;
376           sortw[0]=sortw[1]=1;
377         }
378         break;
379       case 2:
380         if (firstf>1) {
381           sortw[0]=sortw[1]=1;
382           sortw[2]=sortw[3]=0;
383         }
384         break;
385       }
386     }
387   }
388   if (sn==spieler && spitzeang && !sort2[sn]) {
389     sptz=trumpf==4?BUBE:SIEBEN|trumpf<<3;
390   }
391   else sptz=-2;
392   for (i=f;i<f+9;i++) {
393     for (j=i+1;j<f+10;j++) {
394       if (((cards[j]==sptz ||
395 	    lower(cards[i],cards[j],sort2[sn])) &&
396 	   cards[i]!=sptz)^sort1[sn]) {
397 	swap(&cards[i],&cards[j]);
398       }
399     }
400   }
401   sortw[0]=0;
402   sortw[1]=1;
403   sortw[2]=2;
404   sortw[3]=3;
405 }
406 
calc_rw(s)407 VOID calc_rw(s)
408 int s;
409 {
410   int i,c,f,tr,bb,as,ze,dk,stg;
411   int b[4],t[4];
412 
413   maxrw[s]=0;
414   b[0]=b[1]=b[2]=b[3]=0;
415   t[0]=t[1]=t[2]=t[3]=0;
416   bb=as=ze=dk=0;
417   for (i=0;i<10;i++) {
418     c=cards[10*s+i];
419     if ((c&7)==BUBE) {
420       b[c>>3]=1;
421       bb++;
422     }
423     else t[c>>3]++;
424   }
425   tr=0;
426   for (i=1;i<4;i++) {
427     if (t[i]>=t[tr]) tr=i;
428   }
429   for (i=0;i<10;i++) {
430     c=cards[10*s+i];
431     if ((c&7)!=BUBE && c>>3!=tr) {
432       switch (c&7) {
433       case AS:as++;break;
434       case ZEHN:ze++;break;
435       default:dk+=cardw[c&7];
436       }
437     }
438   }
439   if ((bb+t[tr]==4 &&
440        (
441         (as==2 && ze>=2) ||
442         (as>=3)
443 	)) ||
444       (bb+t[tr]==5 &&
445        (
446         (dk+10*ze>=39) ||
447         (as>=1 && ze>=1 && dk+10*ze>=11 && b[3]) ||
448         (as>=2 && dk+10*ze) ||
449         (as>=3)
450 	)) ||
451       (bb+t[tr]==6 &&
452        (
453         (dk+10*ze>=14) ||
454         (ze+as)
455 	)) ||
456       bb+t[tr]>=7
457       ) {
458     f=2;
459     if (b[3]) {
460       while (f<5 && b[4-f]) f++;
461     }
462     maxrw[s]=f*rwert[tr];
463   }
464   if (!maxrw[s]) testnull(s);
465   if (!maxrw[s] &&
466       (((b[3] || b[2] || bb==2) &&
467        ((b[3] && b[2] && as>=2) ||
468 	(bb+t[tr]==4 && as>=1 && dk+10*ze+11*as>=29) ||
469 	(bb+t[tr]==5 && dk+10*ze+11*as>=19) ||
470 	(bb+t[tr]==5 && ze+as>1) ||
471 	(bb+t[tr]==6 && bb>2) ||
472 	(bb+t[tr]==6 && dk+10*ze>=8))) ||
473        (bb+t[tr]==4 && bb && as>1) ||
474        (bb+t[tr]==5 && as>1) ||
475        (bb+t[tr]==5 && dk+10*ze+11*as>=32))) maxrw[s]=18;
476   if (!maxrw[s] &&
477       (((b[3] || b[2] || bb==2) && (bb+t[tr]==6)) ||
478        (bb+t[tr]==4 && bb>1 && as) ||
479        (bb+t[tr]==4 && bb && as && ze && dk) ||
480        (bb+t[tr]==5 && bb && as && ze) ||
481        (bb+t[tr]==5 && bb && ze && dk>4) ||
482        (bb+t[tr]==5 && bb && ze>1) ||
483        (bb+t[tr]==5 && bb>1) ||
484        (bb+t[tr]==6 && dk+10*ze+11*as>=8))) maxrw[s]=17;
485   stg=strateg[numsp==0?s:numsp==1?s-1:0];
486   if (stg<0 && rnd(3)<-stg) {
487     if (maxrw[s]>17) maxrw[s]=17;
488     else if (maxrw[s]==17 || rnd(7)<-stg) maxrw[s]=2*rwert[tr];
489     else maxrw[s]=17;
490   }
491 }
492 
do_geben()493 VOID do_geben()
494 {
495   int sn,i;
496   static int f;
497 
498   sort2[0]=sort2[1]=sort2[2]=0;
499   prot2.verdopp[0]=prot2.verdopp[1]=prot2.verdopp[2]=0;
500   schnang=schwang=ouveang=spitzeang=revolang=0;
501   ndichtw=0;
502   hintcard[0]=-1;
503   hintcard[1]=-1;
504   for (sn=0;sn<numsp;sn++) calc_desk(sn);
505   if (!wieder) {
506     if (ramschspiele) {
507       if (trumpf==4) geber=right(geber);
508       else ramschspiele--;
509     }
510     else if (bockspiele) {
511       bockspiele--;
512       if (bockspiele%3==0 && playbock==2) {
513 	ramschspiele=3;
514       }
515     }
516     bockspiele+=3*bockinc;
517     geber=left(geber);
518   }
519   else if (!vorhandwn) {
520     geber=left(geber+wieder);
521   }
522   bockinc=0;
523   trumpf=-1;
524   hoerer=ausspl=left(geber);
525   sager=right(geber);
526   mischen();
527   setcurs(0);
528   givecard(hoerer,0);
529   givecard(sager,0);
530   givecard(geber,0);
531   givecard(-1,0);
532   givecard(hoerer,1);
533   givecard(sager,1);
534   givecard(geber,1);
535   givecard(hoerer,2);
536   givecard(sager,2);
537   givecard(geber,2);
538   for (sn=0;sn<numsp;sn++) initscr(sn,1);
539   for (i=0;i<3;i++) {
540     lastmsaho[i]=0;
541     sagte18[i]=0;
542   }
543   kontrastufe=0;
544   schenkstufe=0;
545   saho=1;
546   reizp=0;
547   clear_info();
548   if (!dlhintseen) {
549     di_copyr(0);
550   }
551   else if (firstgame) {
552     di_options(-1);
553   }
554   else if (!f &&
555 	   (sum[0][0] || sum[0][1] || sum[0][2] ||
556 	    sum[1][0] || sum[1][1] || sum[1][2] ||
557 	    sum[2][0] || sum[2][1] || sum[2][2])) {
558     di_delliste();
559   }
560   f=1;
561   if (ramschspiele) {
562     phase=ANSAGEN;
563     di_grandhand(hoerer);
564   }
565   else if (playramsch>1) {
566     init_ramsch();
567   }
568   else {
569     putmark(hoerer);
570     put_box(sager);
571     put_box(hoerer);
572     for (sn=numsp;sn<3;sn++) calc_rw(sn);
573     phase=REIZEN;
574   }
575 }
576 
do_sagen(s,w)577 VOID do_sagen(s,w)
578 int s,w;
579 {
580   char str[4];
581   tx_typ tt;
582   int ln;
583 
584   for (ln=0;ln<NUM_LANG;ln++) {
585     tt.t[ln]=str;
586   }
587   sprintf(str,"%d",w);
588   b_text(s,&tt);
589   inv_box(s,0,1);
590   stdwait();
591   inv_box(s,0,0);
592   sagte18[s]=1;
593 }
594 
do_passen(s)595 VOID do_passen(s)
596 int s;
597 {
598   b_text(s,&textarr[TX_PASSE]);
599   inv_box(s,1,1);
600   stdwait();
601   inv_box(s,1,0);
602   rem_box(s);
603 }
604 
do_akzept(s)605 VOID do_akzept(s)
606 int s;
607 {
608   tx_typ tt;
609   int ln;
610 
611   for (ln=0;ln<NUM_LANG;ln++) {
612     tt.t[ln]=" ";
613   }
614   b_text(s,&textarr[TX_JA]);
615   inv_box(s,0,1);
616   stdwait();
617   inv_box(s,0,0);
618   b_text(s,&tt);
619   sagte18[s]=1;
620 }
621 
do_msagen(sn,w)622 VOID do_msagen(sn,w)
623 int sn,w;
624 {
625   char str[4];
626 
627   if (lastmsaho[sn]==w) return;
628   lastmsaho[sn]=w;
629   sprintf(str,"%d",w);
630   do_msaho(sn,str);
631 }
632 
do_mhoeren(sn)633 VOID do_mhoeren(sn)
634 int sn;
635 {
636   if (lastmsaho[sn]==1) return;
637   lastmsaho[sn]=1;
638   do_msaho(sn,textarr[TX_JA].t[lang[sn]]);
639 }
640 
do_entsch()641 VOID do_entsch()
642 {
643   int rw;
644 
645   rw=reizw[reizp];
646   if (saho) {
647     if (maxrw[sager]>=rw || (maxrw[sager]==17 && rw==18)) {
648       do_sagen(sager,rw);
649       saho=0;
650       if (sager==hoerer) {
651         spieler=sager;
652 	do_handspiel();
653       }
654     }
655     else {
656       do_passen(sager);
657       if (sager==geber || sager==hoerer) {
658         if (sager==hoerer) {
659           reizp--;
660 	  do_handspiel();
661         }
662         else {
663           if (reizp) {
664             spieler=hoerer;
665             reizp--;
666 	    do_handspiel();
667           }
668           else {
669             rem_box(sager);
670             sager=hoerer;
671           }
672         }
673       }
674       else {
675         rem_box(sager);
676         sager=geber;
677         put_box(sager);
678       }
679     }
680   }
681   else {
682     if (maxrw[hoerer]>=rw) {
683       do_akzept(hoerer);
684       reizp++;
685       saho=1;
686     }
687     else {
688       do_passen(hoerer);
689       if (sager==geber) {
690         spieler=sager;
691 	do_handspiel();
692       }
693       else {
694         rem_box(hoerer);
695         rem_box(sager);
696         hoerer=sager;
697         sager=geber;
698         reizp++;
699         saho=1;
700         put_box(hoerer);
701         put_box(sager);
702       }
703     }
704   }
705 }
706 
do_reizen()707 VOID do_reizen()
708 {
709   while (phase==REIZEN &&
710 	 ((iscomp(sager) && saho) || (iscomp(hoerer) && !saho))) {
711     do_entsch();
712   }
713   if (phase==REIZEN) {
714     if (saho) do_msagen(sager,reizw[reizp]);
715     else do_mhoeren(hoerer);
716   }
717 }
718 
drueck(f,n,p)719 VOID drueck(f,n,p)
720 int f,n,*p;
721 {
722   int i,j;
723 
724   for (i=trumpf!=5;i<8 && n && gedr<2;i++) {
725     if (inhand[f][i]) {
726       inhand[f][i]=0;
727       (*p)-=cardw[i];
728       if (!gedr && cards[31]==(f<<3)+i) {
729 	swap(&cards[30],&cards[31]);
730       }
731       else {
732 	for (j=0;j<10;j++) {
733 	  if (cards[spieler*10+j]==(f<<3)+i) {
734 	    swap(&cards[30+gedr],&cards[10*spieler+j]);
735 	    break;
736 	  }
737 	}
738       }
739       gedr++;
740       n--;
741     }
742   }
743 }
744 
truempfe()745 VOID truempfe()
746 {
747   int i,c;
748 
749   for (c=0;c<2;c++) {
750     if ((cards[30+c]&7)==BUBE || cards[30+c]>>3==trumpf) {
751       for (i=0;i<10;i++) {
752         if ((cards[10*spieler+i]&7)!=BUBE
753           && cards[10*spieler+i]>>3!=trumpf) {
754           swap(&cards[30+c],&cards[10*spieler+i]);
755           break;
756         }
757       }
758     }
759   }
760 }
761 
tr_voll(sn,f)762 int tr_voll(sn,f)
763 int sn,f;
764 {
765   int i,c,t,a,z,n[4],ze[4];
766 
767   if (trumpf==-1 || trumpf==4) return f;
768   t=a=z=0;
769   n[0]=n[1]=n[2]=n[3]=0;
770   ze[0]=ze[1]=ze[2]=ze[3]=0;
771   for (i=0;i<10;i++) {
772     c=cards[10*sn+i];
773     if ((c&7)==BUBE || c>>3==trumpf) t++;
774     else if ((c&7)==AS) a++;
775     else if ((c&7)==ZEHN) z++,ze[c>>3]=1;
776     else n[c>>3]++;
777   }
778   if (f) {
779     return t>7 || (t>6 && a+z);
780   }
781   return (t>5 || (t>4 && a+z) || (t>3 && a>2)) &&
782     !(t==4 &&
783       ((ze[0] && !n[0]) || (ze[1] && !n[1]) ||
784        (ze[2] && !n[2]) || (ze[3] && !n[3])));
785 }
786 
sage_kontra(sn)787 int sage_kontra(sn)
788 int sn;
789 {
790   return tr_voll(sn,0);
791 }
792 
sage_re(sn)793 int sage_re(sn)
794 int sn;
795 {
796   return tr_voll(sn,1);
797 }
798 
testgrand(bb,b,vh)799 int testgrand(bb,b,vh)
800 int bb,b[4],vh;
801 {
802   int i,j,fl,ih,g3,g4,as,ze,ko,a[4],bz;
803 
804   bz=2;
805   for (j=0;j<4;j++) {
806     a[j]=0;
807     for (i=0;i<8;i++) {
808       if (i>=BUBE || i==ZEHN) continue;
809       a[j]+=inhand[j][i];
810     }
811     if (inhand[j][ZEHN] && !a[j]) bz=1;
812   }
813   if (bb==2 && spieler!=ausspl) bz=1;
814   as=inhand[0][AS]+inhand[1][AS]+inhand[2][AS]+inhand[3][AS];
815   ze=inhand[0][ZEHN]+inhand[1][ZEHN]+inhand[2][ZEHN]+inhand[3][ZEHN];
816   ko=inhand[0][KOENIG]+inhand[1][KOENIG]+inhand[2][KOENIG]+inhand[3][KOENIG];
817   if (bb==2 && as>2 && ze) return bz;
818   if (bb && as>2 && ze==4) return bz;
819   if (as==4 && ze>3-bb) return 2;
820   if (as==4 && ze>2-bb) return 1;
821   if (bb<=2 && (!b[3] || bb!=2 || spieler!=ausspl)) return 0;
822   fl=g3=g4=0;
823   for (i=0;i<4;i++) {
824     ih=0;
825     for (j=0;j<8;j++) {
826       if (j!=BUBE && inhand[i][j]) ih++;
827     }
828     for (j=0;j<8;j++) {
829       if (j!=BUBE) {
830         if (inhand[i][j]) fl++;
831         else if (7-ih>j) break;
832       }
833     }
834     if ((ih>4) ||
835 	(ih>3 && (inhand[i][AS] || inhand[i][ZEHN]))) g4=1;
836     if (ih>4 && (inhand[i][AS] || inhand[i][ZEHN])) g3=1;
837     if (ih>3 && inhand[i][AS] && inhand[i][ZEHN]) g3=1;
838   }
839   if (fl+bb>5) return bz;
840   if (bb==4 && g4) return bz;
841   if ((bb==3 && (b[3] || vh) && g3)) return bz;
842   return fl+bb>4 && b[3] && !(bb+as==5 && !ze && !ko);
843 }
844 
calc_inhand(sn)845 VOID calc_inhand(sn)
846 int sn;
847 {
848   int i,c;
849 
850   for (i=0;i<4;i++) {
851     for (c=0;c<8;c++) inhand[i][c]=0;
852   }
853   for (i=0;i<10;i++) {
854     c=cards[10*sn+i];
855     if (c>=0) {
856       inhand[c>>3][c&7]=1;
857     }
858   }
859 }
860 
testhand()861 int testhand()
862 {
863   int i,c,f,bb,as;
864   int b[4],t[4],p[4],o[4];
865 
866   for (i=0;i<4;i++) {
867     b[i]=t[i]=p[i]=0;
868     o[i]=i;
869   }
870   bb=0;
871   for (i=0;i<4;i++) {
872     for (c=0;c<8;c++) inhand[i][c]=0;
873   }
874   for (i=0;i<10;i++) {
875     c=spcards[i];
876     if ((c&7)==BUBE) {
877       b[c>>3]=1;
878       bb++;
879     }
880     else {
881       p[c>>3]+=cardw[c&7];
882       t[c>>3]++;
883       inhand[c>>3][c&7]=1;
884     }
885   }
886   for (i=1;i<4;i++) {
887     if (inhand[i][ZEHN] && !inhand[i][AS] && !inhand[i][KOENIG]) {
888       o[i]=0;
889       o[0]=i;
890       break;
891     }
892   }
893   f=3;
894   while (f<5 && b[4-f]==b[3]) f++;
895   trumpf=0;
896   while (f*rwert[trumpf]<reizw[reizp]) trumpf++;
897   for (i=trumpf+1;i<4;i++) {
898     if (t[i]>t[trumpf] || (t[i]==t[trumpf] && p[i]<=p[trumpf])) trumpf=i;
899   }
900   if (testgrand(bb,b,spieler==ausspl)==2) {
901     trumpf=4;
902     return 1;
903   }
904   as=0;
905   for (i=0;i<4;i++) {
906     if (inhand[i][AS] && i!=trumpf) as++;
907   }
908   if (t[trumpf]+bb>7 && as) return 1;
909   return 0;
910 }
911 
912 #define DRUECKEN(T,N,C)\
913 {\
914   for (i=0;x && i<4;i++) {\
915     if (i!=trumpf && t[i]==(T) && (C)) {\
916       drueck(i,N,&p[i]);\
917       t[i]-=(N);\
918       x=0;\
919       break;\
920     }\
921   }\
922 }
923 
924 #define LUSCHE()\
925 (\
926   inhand[i][SIEBEN] || inhand[i][ACHT] || inhand[i][NEUN]\
927 )
928 
calc_drueck()929 VOID calc_drueck()
930 {
931   int i,j,c,f,bb,n,sp,tr,x;
932   int b[4],t[4],p[4],o[4];
933   int savecards[32];
934 
935   if (iscomp(spieler)) {
936     if (maxrw[spieler]==nullw[0] ||
937 	maxrw[spieler]==nullw[1] ||
938 	maxrw[spieler]==nullw[2] ||
939 	maxrw[spieler]==nullw[3] ||
940 	maxrw[spieler]==nullw[4]) {
941       trumpf=-1;
942       if (maxrw[spieler]!=nullw[0] && maxrw[spieler]!=nullw[2]) handsp=1;
943       if (maxrw[spieler]>=nullw[3]) ouveang=1;
944       if (maxrw[spieler]==nullw[4]) revolang=1;
945       gedr=2;
946       return;
947     }
948     if (testhand()) {
949       gedr=2;
950       handsp=1;
951       return;
952     }
953   }
954   else {
955     for (i=0;i<32;i++) savecards[i]=cards[i];
956   }
957   for (i=0;i<4;i++) {
958     b[i]=t[i]=p[i]=0;
959   }
960   bb=0;
961   for (i=0;i<4;i++) {
962     for (c=0;c<8;c++) inhand[i][c]=0;
963   }
964   for (i=0;i<12;i++) {
965     c=spcards[i];
966     if ((c&7)==BUBE) {
967       b[c>>3]=1;
968       bb++;
969     }
970     else {
971       p[c>>3]+=cardw[c&7];
972       t[c>>3]++;
973       inhand[c>>3][c&7]=1;
974     }
975   }
976   f=2;
977   while (f<5 && b[4-f]==b[3]) f++;
978   trumpf=0;
979   if (iscomp(spieler)) {
980     while (f*rwert[trumpf]<reizw[reizp]) trumpf++;
981   }
982   for (i=trumpf+1;i<4;i++) {
983     if (t[i]>t[trumpf] || (t[i]==t[trumpf] && p[i]<=p[trumpf])) trumpf=i;
984   }
985   tr=t[trumpf];
986   truempfe();
987   do {
988     x=1;
989     if (!gedr) {
990       DRUECKEN(1,1,inhand[i][ZEHN]);
991       DRUECKEN(2,1,inhand[i][ZEHN] && (inhand[i][DAME] || LUSCHE()));
992       DRUECKEN(1,1,inhand[i][KOENIG]);
993       DRUECKEN(2,2,inhand[i][KOENIG] && inhand[i][DAME]);
994       DRUECKEN(1,1,inhand[i][DAME]);
995       DRUECKEN(2,2,inhand[i][KOENIG] && LUSCHE());
996       DRUECKEN(2,2,inhand[i][DAME] && LUSCHE());
997       DRUECKEN(2,2,inhand[i][ZEHN] && inhand[i][KOENIG]);
998       DRUECKEN(1,1,!p[i]);
999       DRUECKEN(2,2,!p[i]);
1000       DRUECKEN(2,1,inhand[i][AS] && inhand[i][KOENIG]);
1001       DRUECKEN(2,1,inhand[i][AS] && inhand[i][DAME]);
1002       DRUECKEN(2,1,inhand[i][AS] && LUSCHE());
1003     }
1004     else {
1005       DRUECKEN(1,1,inhand[i][ZEHN]);
1006       DRUECKEN(2,1,inhand[i][ZEHN] && (inhand[i][DAME] || LUSCHE()));
1007       DRUECKEN(1,1,inhand[i][KOENIG]);
1008       DRUECKEN(1,1,inhand[i][DAME]);
1009       DRUECKEN(1,1,!p[i]);
1010       DRUECKEN(2,1,inhand[i][KOENIG] && LUSCHE());
1011       DRUECKEN(2,1,inhand[i][DAME] && LUSCHE());
1012       DRUECKEN(2,1,inhand[i][KOENIG] && inhand[i][DAME]);
1013       DRUECKEN(2,1,!p[i]);
1014       DRUECKEN(2,1,inhand[i][AS] && inhand[i][KOENIG]);
1015       DRUECKEN(2,1,inhand[i][AS] && inhand[i][DAME]);
1016       DRUECKEN(2,1,inhand[i][AS] && LUSCHE());
1017       DRUECKEN(2,1,inhand[i][ZEHN] && inhand[i][KOENIG]);
1018     }
1019   } while (gedr<2 && !x);
1020   for (i=0;i<4;i++) {
1021     o[i]=i;
1022   }
1023   for (i=0;i<4;i++) {
1024     for (j=i+1;j<4;j++) {
1025       if (p[o[i]]>p[o[j]]) {
1026 	x=o[i];
1027 	o[i]=o[j];
1028 	o[j]=x;
1029       }
1030     }
1031   }
1032   for (n=3;n<8 && gedr<2;n++) {
1033     for (j=0;j<4 && gedr<2;j++) {
1034       i=o[j];
1035       if (t[i]==n && i!=trumpf) {
1036 	if (inhand[i][AS]) {
1037 	  if (!inhand[i][ZEHN]) drueck(i,2,&p[i]);
1038 	}
1039 	else drueck(i,2,&p[i]);
1040       }
1041     }
1042   }
1043   if (testgrand(bb,b,spieler==ausspl)) {
1044     trumpf=4;
1045   }
1046   if (spitzezaehlt &&
1047       ((trumpf<4 && inhand[trumpf][SIEBEN] &&
1048 	((tr+bb>=7 && (bb>1 || !b[0])) ||
1049 	  (tr+bb==6 && bb>=4))) ||
1050        (trumpf==4 && b[0] && b[3] &&
1051 	bb==3 && spieler==ausspl))) {
1052     sp=trumpf==4?BUBE:SIEBEN|trumpf<<3;
1053     if (cards[30]!=sp && cards[31]!=sp) {
1054       spitzeang=1;
1055     }
1056   }
1057   if (iscomp(spieler)) {
1058     gespcd[cards[30]]=1;
1059     gespcd[cards[31]]=1;
1060   }
1061   else {
1062     for (j=0;j<2;j++) {
1063       for (i=0;i<12;i++) {
1064 	if (cards[30+j]==spcards[i]) {
1065 	  hintcard[j]=i<10?10*spieler+i:20+i;
1066 	  break;
1067 	}
1068       }
1069     }
1070     for (i=0;i<32;i++) cards[i]=savecards[i];
1071   }
1072 }
1073 
nextgame()1074 VOID nextgame()
1075 {
1076   if (numgames) {
1077     phase=GEBEN;
1078     numgames--;
1079     if (!numgames) {
1080       printf("%d ",sum[0][alist[0]]);
1081       printf("%d ",sum[1][alist[0]]);
1082       printf("%d\n",sum[2][alist[0]]);
1083       quit=1;
1084     }
1085   }
1086 }
1087 
save_skat(i)1088 VOID save_skat(i)
1089 int i;
1090 {
1091   if (lower(cards[31],cards[30],0)) {
1092     swap(&cards[31],&cards[30]);
1093   }
1094   prot2.skat[i][0]=cards[30];
1095   prot2.skat[i][1]=cards[31];
1096 }
1097 
check_bockevents()1098 int check_bockevents()
1099 {
1100   int e,m,i,ns,s;
1101 
1102   e=0;
1103   if (bockevents&BOCK_BEI_60) {
1104     if (!spgew && stsum==60 && trumpf>=0 && trumpf<=4) e++;
1105   }
1106   if (bockevents&BOCK_BEI_GRANDHAND) {
1107     if (spgew && trumpf==4 && handsp) e++;
1108   }
1109   m=0;
1110   if (bockevents&BOCK_BEI_KONTRA) {
1111     if (!spgew && kontrastufe) e++,m=1;
1112   }
1113   if (!m && bockevents&BOCK_BEI_RE) {
1114     if (kontrastufe==2) e++;
1115   }
1116   for (i=0;i<3;i++) {
1117     ns=sum[i][alist[0]];
1118     s=ns<0?-ns:ns;
1119     if (ns!=prevsum[i][alist[0]] &&
1120 	((bockevents&BOCK_BEI_NNN &&
1121 	  s%10==s/10%10 && s%10==s/100%10) ||
1122 	 (bockevents&BOCK_BEI_N00 &&
1123 	  s%100==0))) e++;
1124   }
1125   m=0;
1126   if (bockevents&BOCK_BEI_72) {
1127     if (nspwert>=72) e++,m=1;
1128   }
1129   if (!m && bockevents&BOCK_BEI_96) {
1130     if (nspwert>=96) e++;
1131   }
1132   return e;
1133 }
1134 
update_list()1135 VOID update_list()
1136 {
1137   int i;
1138 
1139   if (splstp>=360) {
1140     for (i=0;i<12;i++) {
1141       modsum(splsum,sgewoverl,i,(int *)0,(int *)0,(int *)0,(int *)0);
1142     }
1143     for (i=12;i<splstp;i++) splist[i-12]=splist[i];
1144     splstp-=12;
1145   }
1146   splist[splstp].s=spieler;
1147   splist[splstp].r=trumpf==5;
1148   splist[splstp].d=trumpf==5 && stsum==120 && spgew;
1149   splist[splstp].e=spwert;
1150   splist[splstp].g=spgew;
1151   memcpy((VOID *)prevsum,(VOID *)sum,sizeof(sum));
1152   modsum(sum,cgewoverl,splstp,(int *)0,(int *)0,(int *)0,(int *)0);
1153   splstp++;
1154 }
1155 
do_grandhand(sn)1156 VOID do_grandhand(sn)
1157 int sn;
1158 {
1159   handsp=1;
1160   trumpf=4;
1161   reizp=0;
1162   spieler=sn;
1163   do_handspiel();
1164 }
1165 
set_prot()1166 VOID set_prot()
1167 {
1168   prot2.stichgem=stich-1;
1169   prot2.spieler=spieler;
1170   prot2.trumpf=trumpf;
1171   prot2.gereizt=reizp<0 || ramschspiele?0:reizw[reizp];
1172   prot2.gewonn=spgew;
1173   prot2.augen=stsum;
1174   prot2.handsp=handsp;
1175   prot2.ehsso=
1176     revolang?handsp?1:0:
1177     ouveang?trumpf==-1 && handsp?5:4:
1178     schwang?3:schnang?2:handsp?1:0;
1179   prot2.predef=predef;
1180   if (trumpf!=5) prot2.sramsch=0;
1181   prot2.savseed=savseed;
1182   prot2.gamenr=gamenr-1;
1183   prot2.rotateby=rotateby;
1184   prot2.spitze=spitzeang;
1185   prot2.revolution=revolang;
1186   prot2.schenken=schenkstufe;
1187 }
1188 
do_handspiel()1189 VOID do_handspiel()
1190 {
1191   int i,sn;
1192 
1193   prot2.anspiel[0]=ausspl;
1194   prot2.gemacht[0]=-1;
1195   if (reizp<0 && !ramschspiele) {
1196     if (playramsch>0) {
1197       init_ramsch();
1198       return;
1199     }
1200     stich=1;
1201     fill_st();
1202     trumpf=4;
1203     set_prot();
1204     save_skat(1);
1205     prot1=prot2;
1206     spwert=0;
1207     update_list();
1208     save_list();
1209     if (logging) di_proto(0,1,1);
1210     splres=1;
1211     nextgame();
1212     phase=WEITER;
1213     for (sn=0;sn<numsp;sn++) {
1214       draw_skat(sn);
1215     }
1216     if (numsp==1) di_wiederweiter(0);
1217     else di_weiter(1);
1218     return;
1219   }
1220   info_reiz();
1221   drkcd=0;
1222   if (!ramschspiele) handsp=0;
1223   stsum=0;
1224   vmh=0;
1225   gedr=0;
1226   for (i=0;i<10;i++) spcards[i]=cards[spieler*10+i];
1227   save_skat(0);
1228   spcards[10]=cards[30];
1229   spcards[11]=cards[31];
1230   rem_box(sager);
1231   rem_box(hoerer);
1232   if (!iscomp(spieler) && !ramschspiele) {
1233     phase=HANDSPIEL;
1234     di_hand();
1235   }
1236   else do_handok();
1237 }
1238 
do_druecken()1239 VOID do_druecken()
1240 {
1241   draw_skat(spieler);
1242   if (hintcard[0]==-1) {
1243     gedr=0;
1244     calc_drueck();
1245     trumpf=-1;
1246   }
1247   if (hints[spieler]) {
1248     show_hint(spieler,0,1);
1249     show_hint(spieler,1,1);
1250   }
1251   put_fbox(spieler,TX_DRUECKEN);
1252   drbut=spieler+1;
1253   phase=DRUECKEN;
1254   stsum=0;
1255   gespcd[cards[30]]=0;
1256   gespcd[cards[31]]=0;
1257   gedr=handsp=0;
1258 }
1259 
do_handok()1260 VOID do_handok()
1261 {
1262   if (iscomp(spieler) || handsp) {
1263     home_skat();
1264     if (iscomp(spieler) && !handsp) calc_drueck();
1265     stsum=cardw[cards[30]&7]+cardw[cards[31]&7];
1266     save_skat(1);
1267   }
1268   if (!iscomp(spieler) && !handsp) do_druecken();
1269   else do_ansagen();
1270 }
1271 
do_ansagen()1272 VOID do_ansagen()
1273 {
1274   int i,c,bb;
1275 
1276   phase=ANSAGEN;
1277   bb=kannspitze=0;
1278   for (i=0;i<(handsp?10:12);i++) {
1279     c=i>=10?prot2.skat[1][i-10]:cards[spieler*10+i];
1280     if ((c&7)==BUBE) bb++;
1281     if (i<10) {
1282       if ((c&7)==SIEBEN) {
1283 	kannspitze=1;
1284 	break;
1285       }
1286       if (c==BUBE) {
1287 	kannspitze=2;
1288       }
1289     }
1290   }
1291   if (kannspitze==2) {
1292     kannspitze=bb!=4;
1293   }
1294   if (!iscomp(spieler) && !ramschspiele) {
1295     di_spiel();
1296   }
1297   else {
1298     remmark(1);
1299     di_ansage();
1300   }
1301 }
1302 
karobube()1303 VOID karobube()
1304 {
1305   int s,i,n,k,c;
1306 
1307   karobubeanz=0;
1308   if (trumpf<0 || trumpf>3) return;
1309   for (s=0;s<3;s++) {
1310     if (s==spieler) continue;
1311     n=k=0;
1312     for (i=0;i<10;i++) {
1313       c=cards[s*10+i];
1314       if ((c&7)==BUBE || c>>3==trumpf) {
1315 	n++;
1316 	if ((c&7)<KOENIG) n=9;
1317 	if (c==BUBE) k=1;
1318 	else if ((c&7)==BUBE) n=9;
1319       }
1320     }
1321     if (k && n==2) {
1322       karobubeanz=1;
1323     }
1324   }
1325 }
1326 
karobubespielen()1327 int karobubespielen()
1328 {
1329   int i;
1330 
1331   if (!karobubeanz) return 0;
1332   for (i=0;i<possc;i++) {
1333     if (cards[possi[i]]==BUBE) {
1334       playcd=i;
1335       return 1;
1336     }
1337   }
1338   return 0;
1339 }
1340 
do_angesagt()1341 VOID do_angesagt()
1342 {
1343   if (!iscomp(spieler)) {
1344     remmark(1);
1345   }
1346   stich=1;
1347   schwz=1;
1348   nullv=0;
1349   spitzeok=0;
1350   info_spiel();
1351   sort2[0]=sort2[1]=sort2[2]=trumpf==-1;
1352   if (revolang) revolutiondist();
1353   if (revolang && numsp && (numsp>1 || iscomp(spieler))) revolutionscr();
1354   else spielphase();
1355 }
1356 
spielphase()1357 VOID spielphase()
1358 {
1359   int sn,c,i;
1360 
1361   phase=SPIELEN;
1362   sptruempfe=0;
1363   for (i=0;i<10;i++) {
1364     c=cards[spieler*10+i];
1365     if ((c&7)==BUBE || c>>3==trumpf) sptruempfe++;
1366   }
1367   karobube();
1368   if (ouveang) {
1369     for (sn=0;sn<numsp;sn++) {
1370       di_info(sn,-2);
1371       calc_desk(sn);
1372     }
1373   }
1374   for (sn=numsp;sn<3;sn++) {
1375     sort1[sn]=sort1[0];
1376     sort2[sn]=trumpf==-1;
1377     alternate[sn]=alternate[0];
1378     sort(sn);
1379   }
1380   for (sn=0;sn<numsp;sn++) initscr(sn,1);
1381 }
1382 
higher(c1,c2)1383 int higher(c1,c2)
1384 int c1,c2;
1385 {
1386   int f1,w1,f2,w2;
1387 
1388   if (c2==-1) return 1;
1389   f1=c1>>3;
1390   w1=c1&7;
1391   f2=c2>>3;
1392   w2=c2&7;
1393   if (trumpf==-1) {
1394     if (f1==f2) {
1395       if (w1==ZEHN) return w2>BUBE;
1396       if (w2==ZEHN) return w1<=BUBE;
1397       return w1<w2;
1398     }
1399     return 1;
1400   }
1401   if (w1==BUBE) {
1402     if (w2==BUBE) return f1>f2;
1403     else return 1;
1404   }
1405   if (w2==BUBE) return 0;
1406   if (f1==f2) return w1<w2;
1407   if (f2==trumpf) return 0;
1408   return 1;
1409 }
1410 
calc_result()1411 VOID calc_result()
1412 {
1413   int i,c,f;
1414   int b[4],s[8];
1415 
1416   mes1=mes2=mes3=mes4=0;
1417   if (trumpf==5) {
1418     ramsch_result();
1419     return;
1420   }
1421   if (trumpf==-1) {
1422     spwert=nullw[revolang?4:(ouveang?2:0)+handsp];
1423     if (nullv) {
1424       spgew=0;
1425       if (!handsp || !oldrules) spwert*=2;
1426       nspwert=0;
1427     }
1428     else {
1429       spgew=1;
1430       nspwert=spwert;
1431     }
1432     for (i=0;i<kontrastufe;i++) spwert*=2;
1433     if (bockspiele) spwert*=2;
1434     return;
1435   }
1436   if (stich==1 && schenkstufe) {
1437     stsum=61;
1438     schwz=0;
1439     nullv=1;
1440   }
1441   b[0]=b[1]=b[2]=b[3]=0;
1442   s[0]=s[1]=s[2]=s[3]=s[4]=s[5]=s[6]=s[7]=0;
1443   for (i=0;i<12;i++) {
1444     c=spcards[i];
1445     if ((c&7)==BUBE) b[c>>3]=1;
1446     else if (c>>3==trumpf) s[c&7]=1;
1447   }
1448   s[BUBE]=s[NEUN];
1449   s[NEUN]=s[ACHT];
1450   s[ACHT]=s[SIEBEN];
1451   f=1;
1452   while (f<4 && b[3-f]==b[3]) f++;
1453   if (f==4 && trumpf!=4) {
1454     while (f<11 && s[f-4]==b[3]) f++;
1455   }
1456   f++;
1457   if (handsp) f++;
1458   if (stsum>=90 || schnang || stsum<=30) f++;
1459   if (schnang) f++;
1460   if (schwz || schwang || !nullv) f++;
1461   if (schwang) f++;
1462   if (ouveang) f++;
1463   if (spitzeang) f+=spitzezaehlt;
1464   if (trumpf==4 && ouveang && oldrules) spwert=(f-1)*36;
1465   else spwert=f*rwert[trumpf];
1466   if ((stsum>60 &&
1467        spwert>=reizw[reizp] &&
1468        (stsum>=90 || !schnang) &&
1469        (schwz || !schwang) &&
1470        (spitzeok || !spitzeang))
1471       || stich==1) {
1472     spgew=1;
1473     nspwert=spwert;
1474   }
1475   else {
1476     if (spwert<reizw[reizp]) mes1=1;
1477     else if (schnang && stsum<90) mes2=1;
1478     else if (schwang && !schwz) mes3=1;
1479     else if (spitzeang && !spitzeok) mes4=1;
1480     spgew=0;
1481     if (spwert<reizw[reizp]) {
1482       spwert=((reizw[reizp]-1)/rwert[trumpf]+1)*rwert[trumpf];
1483     }
1484     if (!handsp || !oldrules) spwert*=2;
1485     nspwert=0;
1486   }
1487   for (i=0;i<kontrastufe;i++) spwert*=2;
1488   if (bockspiele && !ramschspiele) spwert*=2;
1489 }
1490 
get_next()1491 VOID get_next()
1492 {
1493   int s;
1494 
1495   prot2.anspiel[stich-1]=ausspl;
1496   prot2.stiche[stich-1][ausspl]=stcd[0];
1497   prot2.stiche[stich-1][left(ausspl)]=stcd[1];
1498   prot2.stiche[stich-1][right(ausspl)]=stcd[2];
1499   if (trumpf==-1) null_stich();
1500   if (higher(stcd[0],stcd[1])) {
1501     if (higher(stcd[0],stcd[2])) s=0;
1502     else s=2;
1503   }
1504   else {
1505     if (higher(stcd[1],stcd[2])) s=1;
1506     else s=2;
1507   }
1508   ausspl=(ausspl+s)%3;
1509   prot2.gemacht[stich-1]=ausspl;
1510   if (spitzeang && stich==10 && ausspl==spieler &&
1511       stcd[s]==(trumpf==4?BUBE:SIEBEN|trumpf<<3)) {
1512     spitzeok=1;
1513   }
1514   if (trumpf==5) {
1515     ramsch_stich();
1516     return;
1517   }
1518   if (stich==1 && !handsp) {
1519     astsum+=stsum;
1520   }
1521   if (spieler==ausspl) {
1522     if (butternok==1) butternok=2;
1523     stsum+=cardw[stcd[0]&7]+cardw[stcd[1]&7]+cardw[stcd[2]&7];
1524     astsum+=cardw[stcd[0]&7]+cardw[stcd[1]&7]+cardw[stcd[2]&7];
1525     nullv=1;
1526   }
1527   else {
1528     if (butternok!=2) butternok=0;
1529     gstsum+=cardw[stcd[0]&7]+cardw[stcd[1]&7]+cardw[stcd[2]&7];
1530     schwz=0;
1531   }
1532 }
1533 
save_list()1534 VOID save_list()
1535 {
1536   FILE *f;
1537   int i;
1538 
1539   if (!list_file) return;
1540   f=fopen(list_file,"w");
1541   if (!f) {
1542     fprintf(stderr,"Can't write file %s\n",list_file);
1543     return;
1544   }
1545   fprintf(f,"%d %d %d\n",splsum[0][0],splsum[1][0],splsum[2][0]);
1546   fprintf(f,"a %d %d %d\n",splsum[0][1],splsum[1][1],splsum[2][1]);
1547   fprintf(f,"t %d %d %d\n",splsum[0][2],splsum[1][2],splsum[2][2]);
1548   fprintf(f,"b %d %d %d\n",bockspiele,bockinc,ramschspiele);
1549   fprintf(f,"g %d %d %d\n",sgewoverl[0][0],sgewoverl[1][0],sgewoverl[2][0]);
1550   fprintf(f,"v %d %d %d\n",sgewoverl[0][1],sgewoverl[1][1],sgewoverl[2][1]);
1551   for (i=0;i<splstp;i++) {
1552     fprintf(f,"e %d %d %d %d %d\n",
1553 	    splist[i].s,splist[i].r,splist[i].d,
1554 	    splist[i].e,splist[i].g);
1555   }
1556   fclose(f);
1557 }
1558 
setsum(clr)1559 VOID setsum(clr)
1560 int clr;
1561 {
1562   int i,j;
1563 
1564   splstp=0;
1565   for (i=0;i<3;i++) {
1566     splfirst[i]=0;
1567     for (j=0;j<3;j++) {
1568       if (clr) {
1569 	sum[i][j]=0;
1570 	if (j<2) {
1571 	  cgewoverl[i][j]=0;
1572 	}
1573       }
1574       splsum[i][j]=sum[i][j];
1575       if (j<2) {
1576 	sgewoverl[i][j]=cgewoverl[i][j];
1577       }
1578     }
1579   }
1580 }
1581 
modsum(sm,gv,p,as,ae,ar,ad)1582 VOID modsum(sm,gv,p,as,ae,ar,ad)
1583 int sm[3][3],gv[3][2],p,*as,*ae,*ar,*ad;
1584 {
1585   int s,e,r,d;
1586 
1587   s=splist[p].s;
1588   r=splist[p].r;
1589   d=splist[p].d;
1590   e=splist[p].e;
1591   if (!splist[p].g) e=-e;
1592   if (e<=0 || !r || d) {
1593     sm[s][0]+=e;
1594     sm[s][2]+=e;
1595     if (e) gv[s][e<0]++;
1596   }
1597   if (e<0) {
1598     sm[s][1]-=e;
1599     if (!r) {
1600       sm[s][2]-=50;
1601       sm[left(s)][2]+=40;
1602       sm[right(s)][2]+=40;
1603     }
1604   }
1605   else {
1606     if (r && !d) {
1607       sm[left(s)][0]-=e;
1608       sm[right(s)][0]-=e;
1609       sm[left(s)][2]-=e;
1610       sm[right(s)][2]-=e;
1611       if (e) {
1612 	gv[left(s)][1]++;
1613 	gv[right(s)][1]++;
1614       }
1615     }
1616     sm[left(s)][1]+=e;
1617     sm[right(s)][1]+=e;
1618     if (!r && e) {
1619       sm[s][2]+=50;
1620     }
1621   }
1622   if (as) *as=s;
1623   if (ae) *ae=e;
1624   if (ar) *ar=r;
1625   if (ad) *ad=d;
1626 }
1627 
read_opt_srpk(f)1628 VOID read_opt_srpk(f)
1629 FILE *f;
1630 {
1631   int i,v,va[3];
1632 
1633   if (fscanf(f,"s %d %d %d\n",&va[0],&va[1],&va[2])==3) {
1634     for (i=0;i<3;i++) {
1635       if (!stgset[i]) {
1636 	if (va[i]<-4) va[i]=-4;
1637 	else if (va[i]>0) va[i]=0;
1638 	strateg[i]=va[i];
1639       }
1640     }
1641   }
1642   if (fscanf(f,"r %d\n",&v)==1) {
1643     if (!ramschset) {
1644       if (v<0) v=0;
1645       else if (v>2) v=2;
1646       playramsch=v;
1647     }
1648   }
1649   if (fscanf(f,"p %d\n",&v)==1) {
1650     if (!sramschset) {
1651       playsramsch=!!v;
1652     }
1653   }
1654   if (fscanf(f,"k %d\n",&v)==1) {
1655     if (!kontraset) {
1656       if (v<0) v=0;
1657       else if (v>2) v=2;
1658       playkontra=v;
1659     }
1660   }
1661 }
1662 
read_opt()1663 VOID read_opt()
1664 {
1665   FILE *f;
1666   int v,va[3],i;
1667   char buf[40];
1668 
1669   dlhintseen=1;
1670   if (!opt_file) return;
1671   dlhintseen=0;
1672   f=fopen(opt_file,"r");
1673   if (!f) {
1674     firstgame=1;
1675     return;
1676   }
1677   read_opt_srpk(f);
1678   if (fscanf(f,"b %d\n",&v)==1) {
1679     if (!bockset) {
1680       if (v<0) v=0;
1681       else if (v>2) v=2;
1682       playbock=v;
1683     }
1684   }
1685   if (fscanf(f,"e %d\n",&v)==1) {
1686     if (!bockeventsset) {
1687       bockevents=v;
1688     }
1689   }
1690   if (fscanf(f,"c %d\n",&v)==1) {
1691     if (!resumebockset) {
1692       resumebock=!!v;
1693     }
1694   }
1695   if (fscanf(f,"d %d %d %d\n",&va[0],&va[1],&va[2])==3) {
1696     for (i=0;i<3;i++) {
1697       if (useoptfile[i] && !downupset[i]) {
1698 	sort1[i]=!!va[i];
1699       }
1700     }
1701   }
1702   if (fscanf(f,"a %d %d %d\n",&va[0],&va[1],&va[2])==3) {
1703     for (i=0;i<3;i++) {
1704       if (useoptfile[i] && !altseqset[i]) {
1705 	alternate[i]=!!va[i];
1706       }
1707     }
1708   }
1709   if (fscanf(f,"t %d %d %d\n",&va[0],&va[1],&va[2])==3) {
1710     for (i=0;i<3;i++) {
1711       if (useoptfile[i] && !tdelayset[i]) {
1712 	if (va[i]<0) va[i]=7;
1713 	else if (va[i]>101) va[i]=101;
1714 	nimmstich[i][0]=va[i];
1715       }
1716     }
1717   }
1718   if (fscanf(f,"l %d %d %d\n",&va[0],&va[1],&va[2])==3) {
1719     for (i=0;i<3;i++) {
1720       if (useoptfile[i] && !alistset[i]) {
1721 	if (va[i]<0) va[i]=0;
1722 	else if (va[i]>2) va[i]=2;
1723 	alist[i]=va[i];
1724       }
1725     }
1726   }
1727   if (fscanf(f,"m %d %d %d\n",&va[0],&va[1],&va[2])==3) {
1728     for (i=0;i<3;i++) {
1729       if (useoptfile[i] && !mbuttonset[i]) {
1730 	if (va[i]<0 || va[i]>5) va[i]=0;
1731 	mbutton[i]=va[i];
1732       }
1733     }
1734   }
1735   if (fscanf(f,"s %d\n",&v)==1) {
1736     if (!spitzezaehltset) {
1737       spitzezaehlt=v;
1738     }
1739   }
1740   if (fscanf(f,"r %d\n",&v)==1) {
1741     if (!revolutionset) {
1742       revolution=!!v;
1743     }
1744   }
1745   if (fscanf(f,"k %d\n",&v)==1) {
1746     if (!klopfenset) {
1747       klopfen=!!v;
1748     }
1749   }
1750   if (fscanf(f,"s %d\n",&v)==1) {
1751     if (!schenkenset) {
1752       schenken=!!v;
1753     }
1754   }
1755   if (fscanf(f,"f %d\n",&v)==1) {
1756     if (!fastdealset) {
1757       fastdeal=!!v;
1758     }
1759   }
1760   if (fscanf(f,"h %d %d %d\n",&va[0],&va[1],&va[2])==3) {
1761     for (i=0;i<3;i++) {
1762       if (useoptfile[i] && !hintsset[i]) {
1763 	hints[i]=!!va[i];
1764       }
1765     }
1766   }
1767   if (fscanf(f,"b %d %d %d\n",&va[0],&va[1],&va[2])==3) {
1768     for (i=0;i<3;i++) {
1769       if (useoptfile[i] && !blattset[i]) {
1770 	if (va[i]<0 || va[i]>3) va[i]=0;
1771 	blatt[i]=va[i];
1772       }
1773     }
1774   }
1775   if (fscanf(f,"l %d %d %d\n",&va[0],&va[1],&va[2])==3) {
1776     for (i=0;i<3;i++) {
1777       if (useoptfile[i] && !langset[i]) {
1778 	if (va[i]<0 || va[i]>=NUM_LANG) va[i]=0;
1779 	lang[i]=va[i];
1780       }
1781     }
1782   }
1783   if (fscanf(f,"a %d %d %d\n",&va[0],&va[1],&va[2])==3) {
1784     for (i=0;i<3;i++) {
1785       if (useoptfile[i] && !abkuerzset[i]) {
1786 	if (va[i]<0 || va[i]>2) va[i]=1;
1787 	abkuerz[i]=va[i];
1788       }
1789     }
1790   }
1791   if (fscanf(f,"o %d\n",&v)==1) {
1792     if (!oldrulesset) {
1793       oldrules=!!v;
1794     }
1795   }
1796   if (fscanf(f,"k %d %d %d\n",&va[0],&va[1],&va[2])==3) {
1797     for (i=0;i<3;i++) {
1798       if (useoptfile[i] && !keyboardset[i]) {
1799 	if (va[i]<0 || va[i]>2) va[i]=1;
1800 	keyboard[i]=va[i];
1801       }
1802     }
1803   }
1804   if (fscanf(f,"b %d %d %d\n",&va[0],&va[1],&va[2])==3) {
1805     for (i=0;i<3;i++) {
1806       if (useoptfile[i] && !briefmsgset[i]) {
1807 	briefmsg[i]=!!va[i];
1808       }
1809     }
1810   }
1811   if (fscanf(f,"l %d %d %d\n",&va[0],&va[1],&va[2])==3) {
1812     for (i=0;i<3;i++) {
1813       if (useoptfile[i] && !trickl2rset[i]) {
1814 	trickl2r[i]=!!va[i];
1815       }
1816     }
1817   }
1818   if (fscanf(f,"s %d\n",&v)==1) {
1819     if (!rskatloserset) {
1820       rskatloser=!!v;
1821     }
1822   }
1823   if (fscanf(f,"d %d\n",&v)==1) {
1824     dlhintseen=1;
1825   }
1826   fscanf(f,"l %35s %35s %35s\n",lanip[0],lanip[1],lanip[2]);
1827   fscanf(f,"i %d %d\n",&laninvite[0],&laninvite[1]);
1828   if (fscanf(f,"h %35s\n",buf)==1) {
1829     if (!irc_hostset) {
1830       strcpy(irc_hostname,buf);
1831     }
1832   }
1833   fscanf(f,"a %9s %9s\n",usrname[0],usrname[1]);
1834   fscanf(f,"a %9s %9s\n",conames[0][0],conames[0][1]);
1835   fscanf(f,"a %9s %9s\n",conames[1][0],conames[1][1]);
1836   fclose(f);
1837 }
1838 
save_opt()1839 VOID save_opt()
1840 {
1841   FILE *f;
1842 
1843   if (!opt_file) return;
1844   f=fopen(opt_file,"w");
1845   if (!f) {
1846     fprintf(stderr,"Can't write file %s\n",opt_file);
1847     return;
1848   }
1849   fprintf(f,"s %d %d %d\n",strateg[0],strateg[1],strateg[2]);
1850   fprintf(f,"r %d\n",playramsch);
1851   fprintf(f,"p %d\n",playsramsch);
1852   fprintf(f,"k %d\n",playkontra);
1853   fprintf(f,"b %d\n",playbock);
1854   fprintf(f,"e %d\n",bockevents);
1855   fprintf(f,"c %d\n",resumebock);
1856   fprintf(f,"d %d %d %d\n",sort1[0],sort1[1],sort1[2]);
1857   fprintf(f,"a %d %d %d\n",alternate[0],alternate[1],alternate[2]);
1858   fprintf(f,"t %d %d %d\n",nimmstich[0][0],nimmstich[1][0],nimmstich[2][0]);
1859   fprintf(f,"l %d %d %d\n",alist[0],alist[1],alist[2]);
1860   fprintf(f,"m %d %d %d\n",mbutton[0],mbutton[1],mbutton[2]);
1861   fprintf(f,"s %d\n",spitzezaehlt);
1862   fprintf(f,"r %d\n",revolution);
1863   fprintf(f,"k %d\n",klopfen);
1864   fprintf(f,"s %d\n",schenken);
1865   fprintf(f,"f %d\n",fastdeal);
1866   fprintf(f,"h %d %d %d\n",hints[0],hints[1],hints[2]);
1867   fprintf(f,"b %d %d %d\n",blatt[0],blatt[1],blatt[2]);
1868   fprintf(f,"l %d %d %d\n",lang[0],lang[1],lang[2]);
1869   fprintf(f,"a %d %d %d\n",abkuerz[0],abkuerz[1],abkuerz[2]);
1870   fprintf(f,"o %d\n",oldrules);
1871   fprintf(f,"k %d %d %d\n",keyboard[0],keyboard[1],keyboard[2]);
1872   fprintf(f,"b %d %d %d\n",briefmsg[0],briefmsg[1],briefmsg[2]);
1873   fprintf(f,"l %d %d %d\n",trickl2r[0],trickl2r[1],trickl2r[2]);
1874   fprintf(f,"s %d\n",rskatloser);
1875   fprintf(f,"d 1\n");
1876   fprintf(f,"l %s %s %s\n",lanip[0],lanip[1],lanip[2]);
1877   fprintf(f,"i %d %d\n",laninvite[0],laninvite[1]);
1878   fprintf(f,"h %s\n",irc_hostname);
1879   fprintf(f,"a %s %s\n",usrname[0],usrname[1]);
1880   fprintf(f,"a %s %s\n",conames[0][0],conames[0][1]);
1881   fprintf(f,"a %s %s\n",conames[1][0],conames[1][1]);
1882   fclose(f);
1883 }
1884 
read_list()1885 VOID read_list()
1886 {
1887   FILE *f;
1888   int c,i,j;
1889 
1890   if (!list_file) return;
1891   f=fopen(list_file,"r");
1892   if (!f) return;
1893   splstp=0;
1894   if (fscanf(f,"%d %d %d\n",&splsum[0][0],&splsum[1][0],&splsum[2][0])!=3) {
1895     splsum[0][0]=splsum[1][0]=splsum[2][0]=0;
1896     fclose(f);
1897     return;
1898   }
1899   if (fscanf(f,"a %d %d %d\n",&splsum[0][1],&splsum[1][1],&splsum[2][1])!=3) {
1900     splsum[0][1]=splsum[1][1]=splsum[2][1]=0;
1901   }
1902   if (fscanf(f,"t %d %d %d\n",&splsum[0][2],&splsum[1][2],&splsum[2][2])!=3) {
1903     splsum[0][2]=splsum[1][2]=splsum[2][2]=0;
1904   }
1905   read_opt_srpk(f);
1906   if (fscanf(f,"b %d %d %d\n",&bockspiele,&bockinc,&ramschspiele)!=3) {
1907     bockspiele=bockinc=ramschspiele=0;
1908   }
1909   if (fscanf(f,"g %d %d %d\n",
1910 	     &sgewoverl[0][0],&sgewoverl[1][0],&sgewoverl[2][0])!=3) {
1911     sgewoverl[0][0]=sgewoverl[1][0]=sgewoverl[2][0]=0;
1912   }
1913   if (fscanf(f,"v %d %d %d\n",
1914 	     &sgewoverl[0][1],&sgewoverl[1][1],&sgewoverl[2][1])!=3) {
1915     sgewoverl[0][1]=sgewoverl[1][1]=sgewoverl[2][1]=0;
1916   }
1917   for (i=0;i<3;i++) {
1918     for (j=0;j<3;j++) {
1919       sum[i][j]=splsum[i][j];
1920     }
1921     for (j=0;j<2;j++) {
1922       cgewoverl[i][j]=sgewoverl[i][j];
1923     }
1924   }
1925   do {
1926     if (fscanf(f,"%d\n",&i)==1) {
1927       splist[splstp].s=i/10000;
1928       splist[splstp].r=(i-splist[splstp].s*10000)/4000;
1929       splist[splstp].d=(i-splist[splstp].s*10000-splist[splstp].r*4000)/2000;
1930       splist[splstp].e=i%2000>>1;
1931       splist[splstp].g=i&1;
1932       modsum(sum,cgewoverl,splstp,(int *)0,(int *)0,(int *)0,(int *)0);
1933       splstp++;
1934     }
1935     else if (fscanf(f,"e %d %d %d %d %d\n",
1936 		    &splist[splstp].s,&splist[splstp].r,&splist[splstp].d,
1937 		    &splist[splstp].e,&splist[splstp].g)==5) {
1938       modsum(sum,cgewoverl,splstp,(int *)0,(int *)0,(int *)0,(int *)0);
1939       splstp++;
1940     }
1941     else {
1942       while ((c=getc(f))!=EOF && c!='\n');
1943     }
1944   } while (!feof(f) && splstp<360);
1945   fclose(f);
1946 }
1947 
fill_st()1948 VOID fill_st()
1949 {
1950   int i,j,s,c,sc;
1951 
1952   for (s=0;s<3;s++) {
1953     if (vmh>=1 && s==ausspl) {
1954       sc=stcd[0];
1955     }
1956     else if (vmh==2 && s==left(ausspl)) {
1957       sc=stcd[1];
1958     }
1959     else {
1960       sc=-1;
1961     }
1962     i=stich-1;
1963     for (j=0;j<10;j++) {
1964       c=cards[10*s+j];
1965       if (c<0 && sc>=0) {
1966 	c=sc;
1967 	sc=-1;
1968       }
1969       if (c>=0) prot2.stiche[i++][s]=c;
1970     }
1971   }
1972 }
1973 
maxnimm()1974 int maxnimm()
1975 {
1976   int i,m;
1977 
1978   m=nimmstich[0][0];
1979   for (i=1;i<numsp;i++) {
1980     if (nimmstich[i][0]>m) m=nimmstich[i][0];
1981   }
1982   return m;
1983 }
1984 
next_stich()1985 VOID next_stich()
1986 {
1987   int nd;
1988 
1989   if (maxnimm()<101) {
1990     waitt(maxnimm()*100,2);
1991   }
1992   info_stich(0,stcd[0]);
1993   info_stich(1,stcd[1]);
1994   info_stich(2,stcd[2]);
1995   nimm_stich();
1996   vmh=0;
1997   stich++;
1998   nd=0;
1999   if (stich==11 ||
2000       (trumpf==-1 &&
2001        (nullv ||
2002 	(!ndichtw && stich<10 &&
2003 	 (nd=null_dicht(spieler,handsp,&prot2.skat[1][0],
2004 			(int *)0,(int *)0,(int *)0)))))) {
2005     if (nd) di_dicht();
2006     else finishgame();
2007   }
2008 }
2009 
finishgame()2010 VOID finishgame()
2011 {
2012   int i,s;
2013 
2014   if (stich<11) {
2015     if (trumpf<0 || trumpf>4 || (schenkstufe && stich==1)) fill_st();
2016     else {
2017       while (stich!=11) {
2018 	s=(ausspl+vmh)%3;
2019 	calc_poss(s);
2020 	make_best(s);
2021 	i=possi[playcd];
2022 	stcd[vmh]=cards[i];
2023 	cards[i]=-1;
2024 	if (vmh==2) {
2025 	  get_next();
2026 	  vmh=0;
2027 	  stich++;
2028 	}
2029 	else vmh++;
2030       }
2031     }
2032   }
2033   calc_result();
2034   set_prot();
2035   prot1=prot2;
2036   update_list();
2037   if (playbock) bockinc=check_bockevents();
2038   save_list();
2039   if (logging) di_proto(0,1,1);
2040   splres=1;
2041   clr_desk(0);
2042   phase=RESULT;
2043   di_result(bockinc);
2044   nextgame();
2045 }
2046 
do_next()2047 VOID do_next()
2048 {
2049   int sn;
2050 
2051   if (vmh==2) {
2052     get_next();
2053     for (sn=0;sn<numsp;sn++) {
2054       if (nimmstich[sn][0]>=101) {
2055 	nimmstich[sn][1]=1;
2056 	phase=NIMMSTICH;
2057       }
2058     }
2059     if (phase==NIMMSTICH) return;
2060     next_stich();
2061   }
2062   else vmh++;
2063 }
2064 
calc_poss(s)2065 VOID calc_poss(s)
2066 int s;
2067 {
2068   int i,j,k,f1,w1,f2,w2;
2069 
2070   possc=0;
2071   for (i=0;i<10;i++) {
2072     if (cards[s*10+i]>=0) {
2073       for (j=0;j<possc && cards[s*10+i]>cards[possi[j]];j++);
2074       for (k=possc;k>j;k--) possi[k]=possi[k-1];
2075       possi[j]=s*10+i;
2076       possc++;
2077     }
2078   }
2079   if (vmh) {
2080     f1=stcd[0]>>3;
2081     w1=stcd[0]&7;
2082     if (trumpf!=-1 && w1==BUBE) f1=trumpf;
2083     i=j=0;
2084     do {
2085       f2=cards[possi[i]]>>3;
2086       w2=cards[possi[i]]&7;
2087       if (trumpf!=-1 && w2==BUBE) f2=trumpf;
2088       if (f1==f2) possi[j++]=possi[i];
2089     } while (++i<possc);
2090     if (j) possc=j;
2091     else hatnfb[s][f1>4?4:f1]=1;
2092   }
2093 }
2094 
c_high(f,h)2095 VOID c_high(f,h)
2096 int f;
2097 int *h;
2098 {
2099   int i,j;
2100 
2101   h[0]=h[1]=h[2]=h[3]=h[4]=-1;
2102   for (i=0;i<4;i++) {
2103     for (j=0;j<8;j++) {
2104       if (j==BUBE) j++;
2105       if (gespcd[i<<3|j]<f) {
2106         h[i]=i<<3|j;
2107         break;
2108       }
2109     }
2110   }
2111   for (i=3;i>=0;i--) {
2112     if (gespcd[i<<3|BUBE]<f) {
2113       h[trumpf]=i<<3|BUBE;
2114       break;
2115     }
2116   }
2117 }
2118 
calc_high(f,s)2119 VOID calc_high(f,s)
2120 int f,s;
2121 {
2122   int i,gespsav[32];
2123 
2124   c_high(f,high);
2125   if (!s) return;
2126   for (i=0;i<32;i++) gespsav[i]=gespcd[i];
2127   for (i=0;i<5;i++) {
2128     if (high[i]>=0) gespcd[high[i]]=2;
2129   }
2130   c_high(f,shigh);
2131   for (i=0;i<32;i++) gespcd[i]=gespsav[i];
2132 }
2133 
zweihoechste(ci)2134 int zweihoechste(ci)
2135 int ci;
2136 {
2137   int i,tr,trdr,cj=ci;
2138 
2139   calc_high(1,1);
2140   if (ci!=high[trumpf]) return 0;
2141   for (i=0;i<possc;i++) {
2142     cj=cards[possi[i]];
2143     if (cj==shigh[trumpf]) break;
2144   }
2145   tr=0;
2146   for (i=0;i<possc;i++) {
2147     if (cards[possi[i]]>>3==trumpf || (cards[possi[i]]&7)==BUBE) {
2148       tr++;
2149     }
2150   }
2151   if (trumpf<4) trdr=7-gespfb[trumpf];
2152   else trdr=0;
2153   for (i=0;i<4;i++) if (!gespcd[i<<3|BUBE]) trdr++;
2154   return ci!=cj && cj==shigh[trumpf] && trdr-tr<=1;
2155 }
2156 
ignorieren()2157 int ignorieren()
2158 {
2159   int mi,fb,i,ih,k[8];
2160 
2161   mi=right(ausspl);
2162   fb=stcd[0]>>3;
2163   if ((stcd[0]&7)==BUBE || fb==trumpf ||
2164       cardw[stcd[0]&7] || hatnfb[mi][fb]==1) return 0;
2165   ih=0;
2166   for (i=0;i<8;i++) k[i]=0;
2167   for (i=0;i<possc;i++) {
2168     if (cards[possi[i]]>>3==fb) {
2169       ih++;
2170       k[cards[possi[i]]&7]=1;
2171     }
2172   }
2173   k[BUBE]=k[NEUN];
2174   k[NEUN]=k[ACHT];
2175   k[ACHT]=k[SIEBEN];
2176   if (ih>=2) {
2177     for (i=AS;i<=NEUN && !k[i];i++) {
2178       if (gespcd[fb<<3|i]!=2) return 0;
2179     }
2180     for (i++;i<=ACHT && !k[i];i++) {
2181       if (gespcd[fb<<3|i]!=2) break;
2182     }
2183     if (k[i]) return 0;
2184   }
2185   if (stich>7) {
2186     for (i=0;i<possc;i++) {
2187       if (cards[possi[i]]>>3==fb && (cards[possi[i]]&7)!=BUBE) {
2188 	if (!higher(stcd[0],cards[possi[i]])) return 0;
2189       }
2190     }
2191   }
2192   return ih<3;
2193 }
2194 
genugdrin()2195 int genugdrin()
2196 {
2197   return
2198     (stcd[0]>>3==cards[possi[0]]>>3 && (cards[possi[0]]&7)!=BUBE) ||
2199       (trumpf!=4 && cardw[stcd[0]&7]+cardw[stcd[1]&7]>0) ||
2200 	cardw[stcd[0]&7]+cardw[stcd[1]&7]>3+rnd(1);
2201 }
2202 
gewinnstich(f)2203 int gewinnstich(f)
2204 int f;
2205 {
2206   int i,p,s,g,ci,sf,su;
2207 
2208   s=f?astsum:gstsum;
2209   sf=0;
2210   if (f) {
2211     if (schnang || spitzeang || stich<6 || s>60) return 0;
2212   }
2213   else {
2214     if (s>59) return 0;
2215     if (s<30) {
2216       su=cardw[prot2.skat[0][0]&7]+cardw[prot2.skat[0][1]&7]+
2217 	cardw[stcd[0]&7]+cardw[stcd[1]&7];
2218       for (i=0;i<30;i++) {
2219 	if (cards[i]>=0) su+=cardw[cards[i]&7];
2220       }
2221       if (su+s<60) sf=1;
2222     }
2223   }
2224   p=!higher(stcd[0],stcd[1]);
2225   g=!f && (spieler==ausspl)^!p;
2226   for (i=0;i<possc;i++) {
2227     ci=cards[possi[i]];
2228     if (!higher(stcd[p],ci) || g) {
2229       if (s+cardw[ci&7]+cardw[stcd[0]&7]+cardw[stcd[1]&7]>59+f) {
2230 	playcd=i;
2231 	return 1;
2232       }
2233       if (sf && s+cardw[ci&7]+cardw[stcd[0]&7]+cardw[stcd[1]&7]>30) {
2234 	playcd=i;
2235 	return 1;
2236       }
2237     }
2238   }
2239   return 0;
2240 }
2241 
uebernehmen(p,h,n)2242 int uebernehmen(p,h,n)
2243 int p,h,n;
2244 {
2245   int i,j,ci,cj,wi,wj,fb,is;
2246 
2247   is=(ausspl+vmh)%3==spieler;
2248   if (is && vmh==1 && !hatnfb[left(spieler)][trumpf] &&
2249       (stcd[0]>>3==trumpf ||
2250        (stcd[0]&7)==BUBE ||
2251        hatnfb[left(spieler)][stcd[0]>>3])) h=0;
2252   j=0;
2253   calc_inhand((ausspl+vmh)%3);
2254   for (i=0;i<possc;i++) {
2255     ci=cards[possi[i]];
2256     if (!higher(stcd[p],ci)) {
2257       if (j) {
2258         cj=cards[possi[j-1]];
2259         wi=cardw[ci&7];
2260         wj=cardw[cj&7];
2261         if (is) {
2262 	  if (h) {
2263 	    calc_high(1,1);
2264 	    fb=wj==2?trumpf:cj>>3;
2265 	    if (cj==high[fb] &&
2266 		shigh[fb]>=0 &&
2267 		!inhand[shigh[fb]>>3][shigh[fb]&7]) {
2268 	      j=i+1;
2269 	      continue;
2270 	    }
2271 	    fb=wi==2?trumpf:ci>>3;
2272 	    if (ci==high[fb] &&
2273 		shigh[fb]>=0 &&
2274 		!inhand[shigh[fb]>>3][shigh[fb]&7]) continue;
2275 	  }
2276         }
2277         if (wi==10) wi=12-h*2;
2278         if (wj==10) wj=12-h*2;
2279         if (wi==2 && wj==2) {
2280 	  if (trumpf==4 && is) {
2281 	    wi=ci>>3;
2282 	    wj=cj>>3;
2283 	  }
2284 	  else {
2285 	    wi=cj>>3;
2286 	    wj=ci>>3;
2287 	  }
2288         }
2289         else {
2290           if (wi==2) wi=5-h*6;
2291           if (wj==2) wj=5-h*6;
2292         }
2293 	if (is) {
2294 	  if (!h && zweihoechste(ci)) j=i+1;
2295 	  else {
2296 	    if (n) {
2297 	      if ((wi==4 && ci>>3!=trumpf) || wi==10) wi=-1;
2298 	      if ((wj==4 && cj>>3!=trumpf) || wj==10) wj=-1;
2299 	    }
2300 	    if ((h || !zweihoechste(cj)) && ((wi<wj)^h)) j=i+1;
2301 	  }
2302 	}
2303 	else {
2304 	  if ((wi<wj)^h) j=i+1;
2305 	}
2306       }
2307       else j=i+1;
2308     }
2309   }
2310   if (j) {
2311     cj=cards[possi[j-1]];
2312     wj=cardw[cj&7];
2313     if (is && vmh==1 && wj>4 && !hatnfb[left(spieler)][trumpf] &&
2314 	(stcd[0]>>3==trumpf ||
2315 	 (wj==10 && !gespcd[(cj&0x18)|AS] && !inhand[cj>>3][AS]) ||
2316 	 (stcd[0]&7)==BUBE ||
2317 	 hatnfb[left(spieler)][stcd[0]>>3])) j=0;
2318     else if (!h && wj==10 && gespcd[(cj&0x18)|AS]<!is+1) j=0;
2319     else playcd=j-1;
2320   }
2321   return j!=0;
2322 }
2323 
schmieren()2324 VOID schmieren()
2325 {
2326   int i,j,wi,wj,ci,cj,aw[4];
2327 
2328   j=0;
2329   aw[0]=aw[1]=aw[2]=aw[3]=11;
2330   calc_high(2,0);
2331   if (vmh!=2) {
2332     for (i=0;i<4;i++) {
2333       if (!(i==trumpf && high[i]!=(i<<3|AS) && possc<3) &&
2334 	  !hatnfb[spieler][i]) aw[i]=2;
2335     }
2336   }
2337   for (i=1;i<possc;i++) {
2338     wi=cardw[(ci=cards[possi[i]])&7];
2339     wj=cardw[(cj=cards[possi[j]])&7];
2340     if (wi==2) wi=-2;
2341     else if (ci>>3==trumpf && cj>>3!=trumpf) wi=1;
2342     else if (wi==11) wi=aw[ci>>3];
2343     if (wj==2) wj=-2;
2344     else if (cj>>3==trumpf && ci>>3!=trumpf) wj=1;
2345     else if (wj==11) wj=aw[cj>>3];
2346     if (wi>wj || (vmh==2 && wi==wj && !wi && (ci&7)>(cj&7))) j=i;
2347   }
2348   playcd=j;
2349 }
2350 
einstechen()2351 int einstechen()
2352 {
2353   int ci;
2354 
2355   if (!cardw[stcd[0]&7] || !uebernehmen(0,0,0)) return 0;
2356   ci=cards[possi[playcd]];
2357   if ((ci&7)<=ZEHN || (ci&7)==BUBE) return 0;
2358   if (ci>>3==trumpf) return 1;
2359   return 0;
2360 }
2361 
niedrighoch(f)2362 int niedrighoch(f)
2363 int f;
2364 {
2365   int i,j,ok,gespsav[32];
2366 
2367   for (i=0;i<32;i++) gespsav[i]=gespcd[i];
2368   ok=j=0;
2369   do {
2370     calc_high(1,0);
2371     if (ok) ok=2;
2372     for (i=0;i<possc;i++) {
2373       if (cards[possi[i]]==high[f]) {
2374 	j++;
2375 	if (f!=trumpf || j<3) {
2376 	  ok=1;
2377 	  playcd=i;
2378 	  gespcd[cards[possi[i]]]=2;
2379 	}
2380       }
2381     }
2382   } while (ok==1);
2383   for (i=0;i<32;i++) gespcd[i]=gespsav[i];
2384   return ok;
2385 }
2386 
ueberdoerfer()2387 int ueberdoerfer()
2388 {
2389   int i,j;
2390 
2391   if ((trumpf==4 &&
2392        (!hatnfb[left(spieler)][trumpf] ||
2393 	!hatnfb[right(spieler)][trumpf]))
2394       || sptruempfe>4) return 0;
2395   calc_high(1,0);
2396   for (i=0;i<possc;i++) {
2397     for (j=0;j<4;j++) {
2398       if (j!=trumpf &&
2399 	  cards[possi[i]]==high[j]) {
2400 	playcd=i;
2401 	return 1;
2402       }
2403     }
2404   }
2405   return 0;
2406 }
2407 
bubeausspielen()2408 int bubeausspielen()
2409 {
2410   int i,c;
2411 
2412   c=-1;
2413   calc_inhand(spieler);
2414   if (inhand[3][BUBE] && inhand[2][BUBE] && inhand[1][BUBE]) {
2415     c=rnd(1)?1:rnd(1)?2:3;
2416   }
2417   else if (inhand[3][BUBE] && inhand[2][BUBE]) {
2418     c=rnd(1)?3:2;
2419   }
2420   else if (inhand[3][BUBE] && inhand[1][BUBE]) {
2421     c=rnd(7)?3:1;
2422   }
2423   else if (inhand[2][BUBE] && inhand[1][BUBE]) {
2424     c=rnd(1)?2:1;
2425   }
2426   if (c>=0) {
2427     c=c<<3|BUBE;
2428     for (i=0;i<possc;i++) {
2429       if (cards[possi[i]]==c) {
2430 	playcd=i;
2431 	return 1;
2432       }
2433     }
2434   }
2435   return 0;
2436 }
2437 
trumpfausspielen()2438 int trumpfausspielen()
2439 {
2440   int i,j,k,g1,g2,tr,trdr,wi,wj;
2441 
2442   g1=left(spieler);
2443   g2=right(spieler);
2444   if (!hatnfb[g1][trumpf] ||
2445       !hatnfb[g2][trumpf]) {
2446     if (trumpf!=4 && bubeausspielen()) return 1;
2447     if (niedrighoch(trumpf)) return 1;
2448   }
2449   if (trumpf==4 &&
2450       hatnfb[g1][trumpf] &&
2451       hatnfb[g2][trumpf]) {
2452     return 0;
2453   }
2454   calc_high(1,0);
2455   tr=wj=0;
2456   j=-1;
2457   for (i=0;i<possc;i++) {
2458     if (cards[possi[i]]>>3==trumpf || (cards[possi[i]]&7)==BUBE) {
2459       tr++;
2460     }
2461   }
2462   trdr=7-gespfb[trumpf];
2463   for (i=0;i<4;i++) if (!gespcd[i<<3|BUBE]) trdr++;
2464   for (i=0;i<possc;i++) {
2465     if (cards[possi[i]]>>3==trumpf || (cards[possi[i]]&7)==BUBE) {
2466       wi=cardw[cards[possi[i]]&7];
2467       if (wi==2 && trdr-tr!=1) wi=-1;
2468       if (j<0 || wi<wj) {
2469         j=i;
2470         wj=wi;
2471       }
2472     }
2473   }
2474   k=possc;
2475   if (trumpf<4) {
2476     trdr=7-gespfb[trumpf];
2477     if (wj!=-1 && (hatnfb[g1][trumpf] || hatnfb[g2][trumpf])) {
2478       calc_inhand(spieler);
2479       for (i=SIEBEN;i>=DAME;i--) {
2480 	if (i==BUBE) continue;
2481 	if (!gespcd[trumpf<<3|i] && !inhand[trumpf][i]) {
2482 	  for (;i>=KOENIG;i--) {
2483 	    if (i==BUBE) continue;
2484 	    if (inhand[trumpf][i]) {
2485 	      for (k=0;k<possc;k++) {
2486 		if (cards[possi[k]]==(trumpf<<3|i)) {
2487 		  break;
2488 		}
2489 	      }
2490 	      break;
2491 	    }
2492 	  }
2493 	  break;
2494 	}
2495       }
2496     }
2497   }
2498   else trdr=0;
2499   for (i=0;i<4;i++) if (!gespcd[i<<3|BUBE]) trdr++;
2500   if ((tr>2 && (trumpf!=4 || trdr-tr)) || (tr>1 && trdr-tr && trdr-tr<=2)) {
2501     playcd=k!=possc && (trdr-tr==2 || !cardw[cards[possi[k]]&7])?k:j;
2502     return 1;
2503   }
2504   for (i=0;i<possc;i++) {
2505     for (j=0;j<4;j++) {
2506       if (j!=trumpf && cards[possi[i]]==high[j]) {
2507 	if ((cards[possi[i]]&7)==AS) playcd=i;
2508         else niedrighoch(j);
2509         return 1;
2510       }
2511     }
2512   }
2513   return 0;
2514 }
2515 
hochausspielen()2516 int hochausspielen()
2517 {
2518   int i,j,k;
2519 
2520   calc_high(2,0);
2521   for (k=0;k<5;k++) {
2522     j=k?k-1:trumpf;
2523     for (i=0;i<possc;i++) {
2524       if (cards[possi[i]]==high[j] &&
2525 	  (j!=trumpf || stich>6) &&
2526 	  (!hatnfb[spieler][j] || stich>7)) {
2527 	playcd=i;
2528 	return 1;
2529       }
2530     }
2531   }
2532   return 0;
2533 }
2534 
schenke()2535 VOID schenke()
2536 {
2537   int i,j,ci,cj,wi,wj,iw,jw,ih[4],ze[4],ko[4],da[4],ne[4];
2538 
2539   if (!vmh && trumpf==4) {
2540     for (i=0;i<4;i++) {
2541       ih[i]=ze[i]=ko[i]=da[i]=ne[i]=0;
2542     }
2543     for (i=0;i<possc;i++) {
2544       ci=cards[possi[i]];
2545       if ((ci&7)!=BUBE) ih[ci>>3]++;
2546       if ((ci&7)==ZEHN) ze[ci>>3]=1;
2547       else if ((ci&7)==KOENIG) ko[ci>>3]=1;
2548       else if ((ci&7)==DAME) da[ci>>3]=1;
2549       else if ((ci&7)==NEUN) ne[ci>>3]=1;
2550     }
2551   }
2552   j=0;
2553   for (i=1;i<possc;i++) {
2554     ci=cards[possi[i]];
2555     cj=cards[possi[j]];
2556     wi=cardw[iw=(ci&7)];
2557     wj=cardw[jw=(cj&7)];
2558     if (wi==2) wi=5;
2559     if (wj==2) wj=5;
2560     if (wi==5 && wj==5) {
2561       wi=ci>>3;
2562       wj=cj>>3;
2563     }
2564     else {
2565       if (!wi && !gespcd[(ci&~7)|AS] && zehnblank(ci) && stich<=6) wi+=4;
2566       if (!wj && !gespcd[(cj&~7)|AS] && zehnblank(cj) && stich<=6) wj+=4;
2567     }
2568     if ((ci&7)==BUBE || ci>>3==trumpf) wi+=5;
2569     if ((cj&7)==BUBE || cj>>3==trumpf) wj+=5;
2570     if (wi<wj ||
2571 	(wi==wj &&
2572 	 (((vmh || trumpf!=4) && iw>=NEUN && jw>=NEUN && iw>jw) ||
2573 	  (!vmh && trumpf==4 && ih[ci>>3]>ih[cj>>3]))
2574 	 )) j=i;
2575   }
2576   if (!vmh && trumpf==4) {
2577     for (i=1;i<possc;i++) {
2578       ci=cards[possi[i]];
2579       cj=cards[possi[j]];
2580       wi=cardw[iw=(ci&7)];
2581       wj=cardw[jw=(cj&7)];
2582       if (ci>>3==cj>>3 && ze[ci>>3] && ko[ci>>3] && ih[ci>>3]>2) {
2583 	if (((wi==4 && !da[ci>>3] && !ne[ci>>3]) ||
2584 	     (wi==3 && !ne[ci>>3]) ||
2585 	     iw==NEUN) && !wj) j=i;
2586       }
2587     }
2588   }
2589   playcd=j;
2590 }
2591 
zehnblank(ci)2592 int zehnblank(ci)
2593 int ci;
2594 {
2595   int i,f,n,z,a,cj;
2596 
2597   f=ci>>3;
2598   n=z=a=0;
2599   for (i=0;i<possc;i++) {
2600     cj=cards[possi[i]];
2601     if ((cj&7)!=BUBE && cj>>3==f) {
2602       n++;
2603       if ((cj&7)==ZEHN) z=1;
2604       else if ((cj&7)==AS) a=1;
2605     }
2606   }
2607   return z && !a && n==2 && !hatnfb[spieler][f];
2608 }
2609 
fabwerfen()2610 int fabwerfen()
2611 {
2612   int i,fb,ci,n[4];
2613 
2614   fb=stcd[0]>>3;
2615   if (!hatnfb[spieler][fb] ||
2616       (vmh==2 && cardw[stcd[0]&7]+cardw[stcd[1]&7]>4) ||
2617       (vmh==1 && cardw[stcd[0]&7]>0)) return 0;
2618   n[0]=n[1]=n[2]=n[3]=0;
2619   for (i=0;i<possc;i++) {
2620     ci=cards[possi[i]];
2621     if ((ci&7)!=BUBE && ci>>3!=trumpf) {
2622       n[ci>>3]++;
2623     }
2624   }
2625   calc_high(1,0);
2626   for (i=0;i<possc;i++) {
2627     ci=cards[possi[i]];
2628     fb=ci>>3;
2629     if ((ci&7)!=BUBE && fb!=trumpf && cardw[ci&7]<=4 &&
2630 	n[fb]==1 && ci!=high[fb]) {
2631       playcd=i;
2632       return 1;
2633     }
2634   }
2635   return 0;
2636 }
2637 
abwerfen()2638 VOID abwerfen()
2639 {
2640   int i,j,ci,cj,wi,wj,mi,wio,wjo,h;
2641   int gsp[4],ze[4],as[4],ih[4];
2642 
2643   for (i=0;i<4;i++) gsp[i]=ze[i]=as[i]=ih[i]=0;
2644   for (i=0;i<32;i++) {
2645     if ((i&7)!=BUBE && gespcd[i]==2) gsp[i>>3]++;
2646   }
2647   for (i=0;i<possc;i++) {
2648     ci=cards[possi[i]];
2649     if ((ci&7)!=BUBE) ih[ci>>3]++;
2650     if ((ci&7)==ZEHN) ze[ci>>3]=1;
2651     else if ((ci&7)==AS) as[ci>>3]=1;
2652   }
2653   j=0;
2654   for (i=1;i<possc;i++) {
2655     ci=cards[possi[i]];
2656     cj=cards[possi[j]];
2657     wi=cardw[ci&7];
2658     wj=cardw[cj&7];
2659     wio=wi;
2660     wjo=wj;
2661     if (wi==2) wi=5;
2662     if (wj==2) wj=5;
2663     if (wi==5 && wj==5) {
2664       wi=ci>>3;
2665       wj=cj>>3;
2666     }
2667     else {
2668       if (stich>7) {
2669 	wi*=2;
2670 	wj*=2;
2671 	if (wi==10 || ci>>3==trumpf) wi+=12;
2672 	if (wj==10 || cj>>3==trumpf) wj+=12;
2673 	if (hatnfb[spieler][ci>>3]) wi-=7;
2674 	if (hatnfb[spieler][cj>>3]) wj-=7;
2675       }
2676       else {
2677 	if (wi==5 || ci>>3==trumpf) wi+=5;
2678 	if (wj==5 || cj>>3==trumpf) wj+=5;
2679 	if (wi<4 && zehnblank(ci) && stich<=7) wi+=wi?2:6;
2680 	if (wj<4 && zehnblank(cj) && stich<=7) wj+=wj?2:6;
2681 	if (!vmh) {
2682 	  if (trumpf==4) {
2683 	    if ((ci&7)!=BUBE && hatnfb[spieler][ci>>3]) wi-=30;
2684 	    if ((cj&7)!=BUBE && hatnfb[spieler][cj>>3]) wj-=30;
2685 	  }
2686 	  else {
2687 	    mi=spieler==left(ausspl)?2:1;
2688 	    wio=wi;
2689 	    wjo=wj;
2690 	    if (!hatnfb[spieler][ci>>3]) wi+=8;
2691 	    else if (hatnfb[spieler][ci>>3] &&
2692 		     hatnfb[(ausspl+mi)%3][ci>>3]!=1 &&
2693 		     ih[ci>>3]+gsp[ci>>3]>4 &&
2694 		     !as[ci>>3] && gespcd[(ci&~7)|AS]!=2) {
2695 	      wi+=35;
2696 	    }
2697 	    else if (wi>4) wi+=8;
2698 	    if (!hatnfb[spieler][cj>>3]) wj+=8;
2699 	    else if (hatnfb[spieler][cj>>3] &&
2700 		     hatnfb[(ausspl+mi)%3][cj>>3]!=1 &&
2701 		     ih[cj>>3]+gsp[cj>>3]>4 &&
2702 		     !as[cj>>3] && gespcd[(cj&~7)|AS]!=2) {
2703 	      wj+=35;
2704 	    }
2705 	    else if (wj>4) wj+=8;
2706 	    if (mi==2 && hatnfb[(ausspl+mi)%3][trumpf]!=1) {
2707 	      h=0;
2708 	      if (hatnfb[(ausspl+mi)%3][ci>>3]==1 && wio<=4) wi-=30,h++;
2709 	      if (hatnfb[(ausspl+mi)%3][cj>>3]==1 && wjo<=4) wj-=30,h++;
2710 	      if (h==2) swap(&wi,&wj);
2711 	    }
2712 	  }
2713 	  if (wi==wj && stich<=3 && ci>>3!=cj>>3) {
2714 	    if (ih[ci>>3]<ih[cj>>3]) wi--;
2715 	    else if (ih[ci>>3]>ih[cj>>3]) wj--;
2716 	    else if (ih[ci>>3]==2) {
2717 	      if (as[ci>>3]) wi-=spieler==left(ausspl)?1:-1;
2718 	      if (as[cj>>3]) wj-=spieler==left(ausspl)?1:-1;
2719 	    }
2720 	    if (spieler==left(ausspl) || trumpf==4) swap(&wi,&wj);
2721 	  }
2722 	}
2723 	else {
2724 	  if (possc==2 && ((stcd[0]&7)==BUBE || stcd[0]>>3==trumpf) &&
2725 	      (wio==2 || wjo==2) && (wio>=10 || wjo>=10)) {
2726 	    if (wio>=10) wi=1,wj=2;
2727 	    else wi=2,wj=1;
2728 	    if (((gespcd[BUBE]==2 &&
2729 		  (gespcd[trumpf<<3|AS]==2 || wio==11 || wjo==11)) ||
2730 		 ci==BUBE || cj==BUBE ||
2731 		 gespcd[2<<3|BUBE]!=2 || gespcd[3<<3|BUBE]!=2) &&
2732 		!(gespcd[2<<3|BUBE]==2 && gespcd[3<<3|BUBE]!=2 && vmh==1)) {
2733 	      swap(&wi,&wj);
2734 	    }
2735 	  }
2736 	  else {
2737 	    if ((ci&7)==BUBE) wi+=5;
2738 	    else if (!hatnfb[spieler][ci>>3] && wi>=4) wi+=3;
2739 	    if ((cj&7)==BUBE) wj+=5;
2740 	    else if (!hatnfb[spieler][cj>>3] && wj>=4) wj+=3;
2741 	    if (vmh==1 && spieler!=ausspl) {
2742 	      if (wi>1 && wi<5 && !wj && !cardw[stcd[0]&7] &&
2743 		  hatnfb[spieler][stcd[0]>>3]) {
2744 		wi=1;wj=2;
2745 	      }
2746 	      else if (wj>1 && wj<5 && !wi && !cardw[stcd[0]&7] &&
2747 		       hatnfb[spieler][stcd[0]>>3]) {
2748 		wi=2;wj=1;
2749 	      }
2750 	    }
2751 	  }
2752 	}
2753       }
2754     }
2755     if (wi<wj ||
2756 	(wi==wj && !cardw[ci&7] && !cardw[cj&7] && (ci&7)>(cj&7))) j=i;
2757   }
2758   playcd=j;
2759 }
2760 
buttern()2761 int buttern()
2762 {
2763   int fb,mi,se;
2764 
2765   se=left(ausspl);
2766   mi=spieler==ausspl?right(ausspl):ausspl;
2767   fb=stcd[0]>>3;
2768   if ((stcd[0]&7)==BUBE) fb=trumpf;
2769   if (stich==9 && spitzeang) return 1;
2770   if (!hatnfb[se][fb]) return 0;
2771   calc_high(2,0);
2772   if (spieler==ausspl) {
2773     if ((fb==trumpf && gespcd[trumpf<<3|AS]==2 &&
2774 	 gespcd[0<<3|BUBE]==2 &&
2775 	 gespcd[1<<3|BUBE]==2 &&
2776 	 gespcd[2<<3|BUBE]==2 &&
2777 	 gespcd[3<<3|BUBE]==2 && rnd(1)) ||
2778 	((stcd[0]&7)==BUBE && gespcd[2<<3|BUBE]==2 && gespcd[3<<3|BUBE]!=2) ||
2779 	higher(stcd[0],high[fb]) ||
2780 	(hatnfb[mi][fb]==1 && hatnfb[mi][trumpf]==1) ||
2781 	(trumpf==4 && (stcd[0]&7)!=BUBE &&
2782 	 (gespcd[0<<3|BUBE]==2 ||
2783 	  gespcd[1<<3|BUBE]==2 ||
2784 	  gespcd[2<<3|BUBE]==2 ||
2785 	  gespcd[3<<3|BUBE]==2)) ||
2786 	(cardw[stcd[0]&7]>4 && rnd(1))) return 0;
2787     if (butternok) return rnd(1);
2788     butternok=rnd(1);
2789     return 1;
2790   }
2791   if (higher(stcd[0],high[trumpf]) && higher(stcd[0],high[fb])) return 1;
2792   if (higher(stcd[0],high[fb]) && !hatnfb[spieler][fb]) {
2793     return 1;
2794   }
2795   return 0;
2796 }
2797 
hatas()2798 int hatas()
2799 {
2800   int f,i,as;
2801 
2802   f=stcd[0]>>3;
2803   as=0;
2804   for (i=0;i<possc;i++) {
2805     if (cards[possi[i]]==(f<<3|AS)) as=i+1;
2806   }
2807   if (!as || (stcd[0]&7)==BUBE || f==trumpf ||
2808       cardw[stcd[0]&7]>4 || hatnfb[spieler][f]) return 0;
2809   playcd=as-1;
2810   return 1;
2811 }
2812 
schnippeln(f)2813 int schnippeln(f)
2814 int f;
2815 {
2816   int fb,i,j,k,as,hi;
2817 
2818   if (gstsum>=44 && gstsum<60) return 0;
2819   if (stich>8 && gstsum<=30) return 0;
2820   fb=stcd[0]>>3;
2821   if ((stcd[0]&7)==BUBE ||
2822       (stcd[f]&7)==BUBE ||
2823       fb==trumpf || stcd[f]>>3==trumpf ||
2824       (f && fb!=stcd[1]>>3) ||
2825       gespcd[fb<<3|ZEHN]==2 ||
2826       gespfb[fb]>3) {
2827     return 0;
2828   }
2829   as=0;
2830   for (i=0;i<possc;i++) {
2831     if (cards[possi[i]]==(fb<<3|AS)) as=i+1;
2832     if (cards[possi[i]]==(fb<<3|ZEHN)) return 0;
2833   }
2834   if (!as) return 0;
2835   possi[as-1]=possi[--possc];
2836   j=k=0;
2837   for (i=1;i<possc;i++) {
2838     if (cards[possi[i]]<cards[possi[j]]) j=i;
2839     if (cards[possi[i]]>cards[possi[k]]) k=i;
2840   }
2841   hi=f?higher(stcd[0],stcd[1])^(spieler==ausspl):cards[possi[j]]<stcd[0];
2842   playcd=hi?j:k;
2843   return 1;
2844 }
2845 
nichtspitze()2846 VOID nichtspitze()
2847 {
2848   int sp,i;
2849 
2850   if (spitzeang) {
2851     sp=trumpf==4?BUBE:SIEBEN|trumpf<<3;
2852     for (i=0;i<possc;i++) {
2853       if (cards[possi[i]]==sp) {
2854 	possc--;
2855 	for (;i<possc;i++) {
2856 	  possi[i]=possi[i+1];
2857 	}
2858 	return;
2859       }
2860     }
2861   }
2862 }
2863 
spitzefangen()2864 int spitzefangen()
2865 {
2866   int i,c,t;
2867 
2868   if (!spitzeang || stich!=9) return 0;
2869   t=-1;
2870   for (i=0;i<possc;i++) {
2871     if (((c=cards[possi[i]])&7)==BUBE || c>>3==trumpf) {
2872       if (t!=-1) return 0;
2873       t=i;
2874     }
2875   }
2876   if (t==-1) return 0;
2877   playcd=t?0:1;
2878   return 1;
2879 }
2880 
restbeimir()2881 int restbeimir()
2882 {
2883   int c,h,i,j,k,s[2];
2884 
2885   if (stich==10 || vmh || ausspl!=spieler || trumpf<0 || trumpf>4) return 0;
2886   s[0]=left(spieler);
2887   s[1]=right(spieler);
2888   if (!hatnfb[s[0]][trumpf] ||
2889       !hatnfb[s[1]][trumpf]) {
2890     if (trumpf==4) return 0;
2891     h=-1;
2892     for (k=0;k<10;k++) {
2893       if ((c=cards[spieler*10+k])>=0) {
2894 	if (c>>3!=trumpf && (c&7)!=BUBE) return 0;
2895 	if (h<0 || !higher(c,cards[spieler*10+h])) h=k;
2896       }
2897     }
2898     for (j=0;j<2;j++) {
2899       for (k=handsp?-1:0;k<10;k++) {
2900 	if ((c=k<0?prot2.skat[0][j]:cards[s[j]*10+k])>=0 &&
2901 	    higher(c,cards[spieler*10+h])) return 0;
2902       }
2903     }
2904     return 1;
2905   }
2906   for (i=0;i<4;i++) {
2907     if (i==trumpf || (hatnfb[s[0]][i] && hatnfb[s[1]][i])) continue;
2908     h=SIEBEN+1;
2909     for (j=0;j<2;j++) {
2910       for (k=handsp?-1:0;k<10;k++) {
2911 	if ((c=k<0?prot2.skat[0][j]:cards[s[j]*10+k])>=0 &&
2912 	    c>>3==i && (c&7)!=BUBE && (c&7)<h) h=c&7;
2913       }
2914     }
2915     for (k=0;k<10;k++) {
2916       if ((c=cards[spieler*10+k])>=0 &&
2917 	  c>>3==i && (c&7)!=BUBE && (c&7)>h) return 0;
2918     }
2919   }
2920   return 1;
2921 }
2922 
m_bvsp()2923 VOID m_bvsp()
2924 {
2925   if (ueberdoerfer()) return;
2926   if (!trumpfausspielen()) schenke();
2927 }
2928 
m_bmsp()2929 VOID m_bmsp()
2930 {
2931   if (fabwerfen()) return;
2932   if (!uebernehmen(0,1,1)) schenke();
2933 }
2934 
m_bhsp()2935 VOID m_bhsp()
2936 {
2937   if (gewinnstich(1)) return;
2938   if (fabwerfen()) return;
2939   if (!uebernehmen(!higher(stcd[0],stcd[1]),1,0)) schenke();
2940 }
2941 
m_bvns()2942 VOID m_bvns()
2943 {
2944   if (spitzefangen()) return;
2945   if (spieler==left(ausspl) && karobubespielen()) return;
2946   if (!hochausspielen()) abwerfen();
2947 }
2948 
m_bmns()2949 VOID m_bmns()
2950 {
2951   if (spitzefangen()) return;
2952   if (karobubespielen()) return;
2953   if (spieler==ausspl) {
2954     if ((rnd(3) && schnippeln(0)) ||
2955 	(!ignorieren() && uebernehmen(0,1,0))) return;
2956   }
2957   else {
2958     if (einstechen() || hatas()) return;
2959   }
2960   if (buttern()) schmieren();
2961   else abwerfen();
2962 }
2963 
m_bhns()2964 VOID m_bhns()
2965 {
2966   if (gewinnstich(0)) return;
2967   if (spitzefangen()) return;
2968   if (rnd(1) && karobubespielen()) return;
2969   if (rnd(3) && schnippeln(1)) return;
2970   if (higher(stcd[0],stcd[1])^(spieler!=ausspl)) {
2971     if (!genugdrin() || !uebernehmen(spieler!=ausspl,1,0)) abwerfen();
2972   }
2973   else {
2974     schmieren();
2975   }
2976 }
2977 
m_bsp()2978 VOID m_bsp()
2979 {
2980   playcd=0;
2981   nichtspitze();
2982   if (!vmh) m_bvsp();
2983   else if (vmh==1) m_bmsp();
2984   else m_bhsp();
2985 }
2986 
m_bns()2987 VOID m_bns()
2988 {
2989   playcd=0;
2990   if (!vmh) m_bvns();
2991   else if (vmh==1) m_bmns();
2992   else m_bhns();
2993 }
2994 
make_best(s)2995 VOID make_best(s)
2996 int s;
2997 {
2998   if (possc==1) playcd=0;
2999   else if (trumpf>4) {
3000     m_bramsch();
3001   }
3002   else if (trumpf>=0) {
3003     if (s==spieler) m_bsp();
3004     else m_bns();
3005   }
3006   else {
3007     if (s==spieler) m_nsp();
3008     else m_nns(s);
3009   }
3010 }
3011 
adjfb(s,v)3012 VOID adjfb(s,v)
3013 int s,v;
3014 {
3015   int i,c,n;
3016   int fb[5];
3017 
3018   fb[0]=fb[1]=fb[2]=fb[3]=fb[4]=0;
3019   n=handsp && s!=spieler?12:10;
3020   for (i=0;i<n;i++) {
3021     if ((c=i<10?cards[10*s+i]:prot2.skat[0][i-10])>=0) {
3022       if (trumpf!=-1 && (c&7)==BUBE) fb[trumpf]=1;
3023       else fb[c>>3]=1;
3024     }
3025   }
3026   for (i=0;i<5;i++) {
3027     if (!fb[i]) {
3028       if (hatnfb[s][i]!=1) hatnfb[s][i]=v;
3029     }
3030   }
3031 }
3032 
do_spielen()3033 VOID do_spielen()
3034 {
3035   int s,i;
3036   static int sp,lvmh;
3037 
3038   if (phase!=SPIELEN) {
3039     sp=0;
3040     return;
3041   }
3042   if (trumpf==-1 && stich==1) init_null();
3043   while (phase==SPIELEN) {
3044     s=(ausspl+vmh)%3;
3045     if (iscomp(s)) sp=0;
3046     else {
3047       if (sp==s+1 && lvmh==vmh) return;
3048       sp=s+1;
3049     }
3050     lvmh=vmh;
3051     if (s==spieler && trumpf!=5) {
3052       adjfb(left(spieler),2);
3053       adjfb(right(spieler),2);
3054       for (i=0;i<5;i++) {
3055 	if (!hatnfb[left(spieler)][i] || !hatnfb[right(spieler)][i]) {
3056 	  if (hatnfb[left(spieler)][i]==2) hatnfb[left(spieler)][i]=0;
3057 	  if (hatnfb[right(spieler)][i]==2) hatnfb[right(spieler)][i]=0;
3058 	}
3059       }
3060     }
3061     if (ouveang) {
3062       adjfb(spieler,1);
3063     }
3064     calc_poss(s);
3065     if (trumpf==-1 && stich==1 && sp) testnull(s);
3066     make_best(s);
3067     hintcard[0]=possi[playcd];
3068     if (sp && hints[s]) {
3069       show_hint(s,0,1);
3070     }
3071     if (!ndichtw && restbeimir()) {
3072       di_dicht();
3073       return;
3074     }
3075     if (sp) return;
3076     drop_card(possi[playcd],s);
3077     do_next();
3078   }
3079 }
3080 
computer()3081 VOID computer()
3082 {
3083   if (quit) return;
3084   if (phase==GEBEN) do_geben();
3085   if (phase==REIZEN) do_reizen();
3086   do_spielen();
3087 }
3088 
play()3089 VOID play()
3090 {
3091   if (!resumebock || !playbock) {
3092     bockspiele=bockinc=ramschspiele=0;
3093   }
3094   else if (playbock!=2) {
3095     ramschspiele=0;
3096   }
3097   phase=GEBEN;
3098   do {
3099     computer();
3100     computer();
3101     hndl_events();
3102   } while (!quit);
3103 }
3104 
main(argc,argv)3105 int main(argc,argv)
3106 int argc;
3107 char *argv[];
3108 {
3109   setrnd(&seed[0],savseed=time((time_t *)0));
3110   xinit(theargc=argc,theargv=argv);
3111   play();
3112   exitus(0);
3113   return 0;
3114 }
3115