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