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 #define XDIAL_C
22 
23 #include <stdlib.h>
24 #include <stdio.h>
25 #include <string.h>
26 #include <ctype.h>
27 #include <unistd.h>
28 #include <X11/Xlib.h>
29 #include <X11/X.h>
30 #include <X11/keysym.h>
31 #include "defs.h"
32 #include "skat.h"
33 #include "ramsch.h"
34 #include "xio.h"
35 #include "irc.h"
36 #include "text.h"
37 #include "xdial.h"
38 
39 #ifndef XK_KP_Tab
40 #define XK_KP_Tab           0xFF89
41 #endif
42 #ifndef XK_KP_Enter
43 #define XK_KP_Enter         0xFF8D
44 #endif
45 #ifndef XK_KP_Left
46 #define XK_KP_Left          0xFF96
47 #endif
48 #ifndef XK_KP_Up
49 #define XK_KP_Up            0xFF97
50 #endif
51 #ifndef XK_KP_Right
52 #define XK_KP_Right         0xFF98
53 #endif
54 #ifndef XK_KP_Down
55 #define XK_KP_Down          0xFF99
56 #endif
57 #ifndef XK_3270_BackTab
58 #define XK_3270_BackTab     0xFD05
59 #endif
60 #ifndef XK_ISO_Left_Tab
61 #define XK_ISO_Left_Tab     0xFE20
62 #endif
63 #ifndef hpXK_BackTab
64 #define hpXK_BackTab    0x1000FF74
65 #endif
66 #ifndef hpXK_KP_BackTab
67 #define hpXK_KP_BackTab 0x1000FF75
68 #endif
69 #ifndef osfXK_BackTab
70 #define osfXK_BackTab   0x1004FF07
71 #endif
72 #ifndef osfXK_Left
73 #define osfXK_Left      0x1004FF51
74 #endif
75 #ifndef osfXK_Up
76 #define osfXK_Up        0x1004FF52
77 #endif
78 #ifndef osfXK_Right
79 #define osfXK_Right     0x1004FF53
80 #endif
81 #ifndef osfXK_Down
82 #define osfXK_Down      0x1004FF54
83 #endif
84 
85 #define INIT_DI(d)\
86 {\
87   memcpy((VOID *)d[1],(VOID *)d[0],sizeof(d[0]));\
88   memcpy((VOID *)d[2],(VOID *)d[0],sizeof(d[0]));\
89   init_di(d[0]);\
90   init_di(d[1]);\
91   init_di(d[2]);\
92 }
93 
info_reiz()94 VOID info_reiz()
95 {
96   int ln,sn;
97   static char txt[NUM_LANG][40];
98   static tx_typ tt;
99 
100   for (ln=0;ln<NUM_LANG;ln++) tt.t[ln]=txt[ln];
101   for (sn=0;sn<numsp;sn++) {
102     if (reizp<0 || ramschspiele) {
103       dioptions[sn][11].str=OB_NONE;
104     }
105     else {
106       dioptions[sn][11].str=&tt;
107       for (ln=0;ln<NUM_LANG;ln++) {
108 	sprintf(txt[ln],"%s %d",textarr[TX_GEREIZT_BIS_L].t[ln],reizw[reizp]);
109       }
110     }
111   }
112 }
113 
trumpf_idx(sn,tr)114 int trumpf_idx(sn,tr)
115 int sn,tr;
116 {
117   return blatt[sn]>=2 && tr>=0 && tr<=3?
118     TX_SCHELLEN+tr:TX_NULL+tr+1;
119 }
120 
info_spiel()121 VOID info_spiel()
122 {
123   int bl,ln,sn;
124   static char txt[2][3][NUM_LANG][40];
125 
126   for (sn=0;sn<numsp;sn++) {
127     dioptions[sn][12].str=&spielstr[0][sn];
128     for (bl=0;bl<2;bl++) {
129       for (ln=0;ln<NUM_LANG;ln++) {
130 	spielstr[bl][sn].t[ln]=txt[bl][sn][ln];
131 	sprintf(txt[bl][sn][ln],"%s %s",textarr[TX_GESPIELT_WIRD].t[ln],
132 		textarr[revolang?TX_REVOLUTION:
133 		       bl && trumpf>=0 && trumpf<=3?
134 		       TX_SCHELLEN+trumpf:TX_NULL+trumpf+1].t[ln]);
135       }
136     }
137   }
138 }
139 
info_stich(p,c)140 VOID info_stich(p,c)
141 int p,c;
142 {
143   int bl,ln,sn;
144   static char txt[2][3][3][NUM_LANG][20];
145 
146   for (sn=0;sn<numsp;sn++) {
147     for (bl=0;bl<2;bl++) {
148       dioptions[sn][14+p].str=&stichstr[0][sn][p];
149       for (ln=0;ln<NUM_LANG;ln++) {
150 	stichstr[bl][sn][p].t[ln]=txt[bl][sn][p][ln];
151 	strcpy(txt[bl][sn][p][ln],
152 	       textarr[(bl?TX_SCHELLEN:TX_KARO)+(c>>3)].t[ln]);
153 	strcat(txt[bl][sn][p][ln]," ");
154 	strcat(txt[bl][sn][p][ln],
155 	       textarr[(bl?TX_ASD:TX_AS)+(c&7)].t[ln]);
156       }
157     }
158   }
159 }
160 
clear_info()161 VOID clear_info()
162 {
163   int sn;
164 
165   for (sn=0;sn<numsp;sn++) {
166     dioptions[sn][11].str=&textarr[TX_GEREIZT_BIS_L];
167     dioptions[sn][12].str=&textarr[TX_GESPIELT_WIRD];
168     dioptions[sn][14].str=OB_NONE;
169     dioptions[sn][15].str=OB_NONE;
170     dioptions[sn][16].str=OB_NONE;
171   }
172 }
173 
set_names(ob,idx)174 VOID set_names(ob,idx)
175 OBJECT *ob;
176 int idx;
177 {
178   int z,s;
179 
180   for (z=0;z<2;z++) {
181     for (s=0;s<3;s++) {
182       ob[idx+z*3+s].str=&tspnames[s][z];
183     }
184   }
185 }
186 
ismemb(w,ob)187 int ismemb(w,ob)
188 Window w;
189 OBJECT *ob;
190 {
191   int i;
192 
193   for (i=0;i<ob[0].spec;i++) {
194     if (w==ob[i].win) return i?i:-1;
195   }
196   return 0;
197 }
198 
init_di(ob)199 VOID init_di(ob)
200 OBJECT *ob;
201 {
202   int i;
203 
204   for (i=1;i<ob[0].spec;i++) {
205     if (ob[i].str!=OB_NONE) {
206       ob[i].str=&textarr[(int)ob[i].str-OB_NONE-1];
207     }
208   }
209 }
210 
init_dials()211 VOID init_dials()
212 {
213   INIT_DI(diende);
214   INIT_DI(diterm);
215   INIT_DI(dismlres);
216   INIT_DI(diproto);
217   INIT_DI(diliste);
218   INIT_DI(dioptions);
219   INIT_DI(dicopyr);
220   INIT_DI(dicopyralt);
221   INIT_DI(digrafik);
222   INIT_DI(distrateg);
223   INIT_DI(divarianten);
224   INIT_DI(diramschopts);
225   INIT_DI(dibockevents);
226   INIT_DI(digeschwindigkeit);
227   INIT_DI(digui);
228   INIT_DI(diweiter);
229   INIT_DI(dikontra);
230   INIT_DI(dikonre);
231   INIT_DI(diinput);
232   init_di(dihand);
233   init_di(digrandhand);
234   init_di(dischieben);
235   init_di(diverdoppelt);
236   init_di(dibuben);
237   init_di(diklopfen);
238   init_di(dischenken);
239   init_di(digeschenkt);
240   init_di(diendeschenken);
241   init_di(diwiederschenken);
242   init_di(dinichtschenken);
243   init_di(diloesch);
244   init_di(dispiel);
245   init_di(difehler);
246   init_di(diueberr);
247   init_di(dispitze);
248   init_di(diansage);
249   init_di(direkontra);
250   init_di(didicht);
251   init_di(diresult);
252   init_di(diwiederweiter);
253   init_di(diwieder);
254   init_di(dimehrspieler);
255   init_di(dilanspiel);
256   init_di(dieigenertisch);
257   init_di(dianderertisch);
258   init_di(diwarteauf);
259   init_di(diirc);
260 }
261 
prverz(sn)262 VOID prverz(sn)
263 int sn;
264 {
265   int ln,n;
266   char *gr="> ";
267   char *em="";
268 
269   n=nimmstich[sn][0];
270   for (ln=0;ln<NUM_LANG;ln++) {
271     if (n>=101) sprintf(digeschwindigkeit[sn][3].str->t[ln],"%s",
272 			textarr[TX_MAUS_KLICK].t[ln]);
273     else {
274       sprintf(digeschwindigkeit[sn][3].str->t[ln],"%s%d.%d %s",
275 	      n<maxnimm()?gr:em,n/10,n%10,textarr[TX_SEKUNDEN].t[ln]);
276     }
277   }
278 }
279 
ob_disabled(ob,i)280 int ob_disabled(ob,i)
281 OBJECT *ob;
282 int i;
283 {
284   return ob[i].spec&OB_DISABLED ||
285     (ob[0].next&OB_DISABLED && !(ob[i].spec&OB_EXIT));
286 }
287 
cleanip(sn)288 VOID cleanip(sn)
289 int sn;
290 {
291   int i;
292 
293   if (!inputbuf[sn][0]) {
294     strcpy(inputbuf[sn],"127.0.0.1");
295   }
296   else {
297     i=0;
298     while (inputbuf[sn][i]) {
299       if (inputbuf[sn][i]==' ') inputbuf[sn][i]='.';
300       i++;
301     }
302   }
303 }
304 
cleanirchost(sn)305 VOID cleanirchost(sn)
306 int sn;
307 {
308   int i;
309 
310   if (!inputbuf[sn][0]) {
311     strncpy(inputbuf[sn],irc_host,35);
312     inputbuf[sn][35]=0;
313   }
314   i=0;
315   while (inputbuf[sn][i]) {
316     if (inputbuf[sn][i]==' ') inputbuf[sn][i]='.';
317     i++;
318   }
319 }
320 
cleanname(sn)321 VOID cleanname(sn)
322 int sn;
323 {
324   int i;
325 
326   i=0;
327   while (inputbuf[sn][i]) {
328     if (inputbuf[sn][i]==' ') inputbuf[sn][i]='_';
329     i++;
330   }
331 }
332 
hndl_btevent(sn,bt)333 VOID hndl_btevent(sn,bt)
334 int sn,bt;
335 {
336   int i,j,c,ag,s1,s2,al,stg[2],sav,bb;
337   OBJECT *ob;
338   static int ircagain;
339 
340   ob=actdial[sn];
341   if (ob_disabled(ob,bt)) return;
342   if ((i=bt+ob[bt].next)!=bt) {
343     while (i!=bt) {
344       if (ob[i].spec&OB_SELECTED) {
345 	ob[i].spec&=~OB_SELECTED;
346 	draw_di(sn,i);
347       }
348       i+=ob[i].next;
349     }
350     if (!(ob[bt].spec&OB_SELECTED)) {
351       ob[bt].spec|=OB_SELECTED;
352       draw_di(sn,bt);
353     }
354   }
355   else {
356     ob[bt].spec^=OB_SELECTED;
357     draw_di(sn,bt);
358   }
359   if (ob[bt].spec&OB_EXIT) {
360     waitt(100,1);
361     if (ob==dihand) {
362       remove_di(sn);
363       if (bt==2) handsp=1;
364       do_handok();
365     }
366     else if (ob==digrandhand) {
367       remove_di(sn);
368       if (bt==3) do_grandhand(sn);
369       else next_grandhand(sn);
370     }
371     else if (ob==diende[sn]) {
372       remove_di(sn);
373       if (bt==2) {
374 	lost[sn]=1;
375 	XUnmapWindow(dpy[sn],win[sn]);
376 	XFlush(dpy[sn]);
377 	if (irc_play) exitus(0);
378 	finish(sn,0);
379       }
380       else {
381 	if (ircagain) {
382 	  startirc(0);
383 	}
384 	if (phase==RESULT) di_resultdi(sn);
385       }
386     }
387     else if (ob==diterm[sn]) {
388       remove_di(sn);
389       if (irc_play) {
390 	ircagain=1;
391 	di_ende(sn);
392       }
393       else {
394 	lost[sn]=1;
395 	XUnmapWindow(dpy[sn],win[sn]);
396 	XFlush(dpy[sn]);
397       }
398     }
399     else if (ob==diloesch) {
400       remove_di(sn);
401       if (bt==2) {
402 	setsum(1);
403 	if (irc_play) irc_sendloeschen(sn);
404 	save_list();
405 	if (phase==RESULT) di_resultdi(sn);
406       }
407       else di_liste(sn,1);
408     }
409     else if (ob==dispiel) {
410       remove_di(sn);
411       if (bt==14) {
412 	cards[30]=prot2.skat[1][0];
413 	cards[31]=prot2.skat[1][1];
414 	umdrueck=1;
415 	do_druecken();
416 	return;
417       }
418       ag=0;
419       if (dispiel[6].spec&OB_SELECTED ||
420 	  dispiel[13].spec&OB_SELECTED) trumpf=-1;
421       else if (dispiel[2].spec&OB_SELECTED) trumpf=0;
422       else if (dispiel[3].spec&OB_SELECTED) trumpf=1;
423       else if (dispiel[4].spec&OB_SELECTED) trumpf=2;
424       else if (dispiel[5].spec&OB_SELECTED) trumpf=3;
425       else trumpf=4;
426       if (!handsp && trumpf!=-1 &&
427 	  (dispiel[8].spec&OB_SELECTED
428 	   || dispiel[9].spec&OB_SELECTED
429 	   || dispiel[10].spec&OB_SELECTED)) {
430 	create_di(sn,difehler);
431 	ag=1;
432       }
433       if (!ag && trumpf==-1 &&
434 	  reizw[reizp]>nullw[dispiel[13].spec&OB_SELECTED?4:
435 			     (dispiel[10].spec&OB_SELECTED?2:0)+handsp]) {
436 	diueberr[6].spec=revolution?OB_CENTERED:OB_HIDDEN;
437 	create_di(sn,diueberr);
438 	ag=1;
439       }
440       spitzeang=0;
441       if (!ag && trumpf!=-1 && dispiel[11].spec&OB_SELECTED) {
442 	bb=0;
443 	for (i=0;i<(handsp?10:12);i++) {
444 	  c=i>=10?prot2.skat[1][i-10]:cards[spieler*10+i];
445 	  if (i<10 && c==(trumpf==4?BUBE:SIEBEN|trumpf<<3)) {
446 	    spitzeang=1;
447 	  }
448 	  if ((c&7)==BUBE) bb++;
449 	}
450 	if (!spitzeang || (bb==4 && trumpf==4)) {
451 	  dispitze[3].str=&textarr[spitzeang?TX_SPITZE_F3:TX_SPITZE_F2];
452 	  create_di(sn,dispitze);
453 	  ag=1;
454 	}
455       }
456       if (!ag) {
457 	if (dispiel[13].spec&OB_SELECTED) revolang=ouveang=1;
458 	else if (dispiel[10].spec&OB_SELECTED) ouveang=schwang=schnang=1;
459 	else if (dispiel[9].spec&OB_SELECTED) schwang=schnang=1;
460 	else if (dispiel[8].spec&OB_SELECTED) schnang=1;
461 	if (trumpf==-1) schwang=schnang=0;
462 	di_ansage();
463       }
464     }
465     else if (ob==difehler) {
466       remove_di(sn);
467       di_spiel();
468     }
469     else if (ob==diueberr) {
470       remove_di(sn);
471       di_spiel();
472     }
473     else if (ob==dispitze) {
474       remove_di(sn);
475       di_spiel();
476     }
477     else if (ob==diansage) {
478       remove_di(sn);
479       do_angesagt();
480     }
481     else if (ob==dikontra[sn]) {
482       remove_di(sn);
483       di_ktrnext(sn,bt==3);
484     }
485     else if (ob==direkontra) {
486       remove_di(sn);
487       di_ktrnext(sn,bt==3);
488     }
489     else if (ob==dikonre[sn]) {
490       remove_di(sn);
491       if (ktrnext>=0) {
492 	di_konre(ktrnext);
493 	ktrnext=-1;
494       }
495       else {
496 	do_angesagt();
497       }
498     }
499     else if (ob==diinput[sn]) {
500       if (bt==3) {
501 	inputbuf[sn][0]='_';
502 	inputbuf[sn][1]=0;
503 	diinput[sn][3].spec&=~OB_SELECTED;
504 	if (actbtn[sn]!=4) {
505 	  actbtn[sn]=4;
506 	  draw_di(sn,4);
507 	}
508 	draw_di(sn,3);
509 	draw_di(sn,2);
510       }
511       else {
512 	inputbuf[sn][strlen(inputbuf[sn])-1]=0;
513 	switch (inputdi[sn]) {
514 	case 0:
515 	  cleanip(sn);
516 	  save_opt();
517 	  di_eigenertisch(sn);
518 	  break;
519 	case 1:
520 	  cleanip(sn);
521 	  save_opt();
522 	  di_anderertisch(sn);
523 	  break;
524 	case 2:
525 	  cleanirchost(sn);
526 	  save_opt();
527 	  di_irc(sn);
528 	  break;
529 	case 3:
530 	  cleanname(sn);
531 	  set_conames();
532 	  save_opt();
533 	  di_strateg(sn);
534 	  break;
535 	case 4:
536 	  cleanname(sn);
537 	  set_conames();
538 	  save_opt();
539 	  di_grafik(sn);
540 	  break;
541 	}
542       }
543     }
544     else if (ob==didicht) {
545       remove_di(sn);
546       if (didicht[3].spec&OB_SELECTED ||
547 	  didicht[5].spec&OB_SELECTED) {
548 	spielendscr();
549 	if (didicht[5].spec&OB_SELECTED) {
550 	  abkuerz[sn]=2;
551 	  save_opt();
552 	}
553       }
554       else if (didicht[4].spec&OB_SELECTED ||
555 	       didicht[6].spec&OB_SELECTED) {
556 	ndichtw=1;
557 	phase=SPIELEN;
558 	if (didicht[6].spec&OB_SELECTED) {
559 	  abkuerz[sn]=0;
560 	  save_opt();
561 	}
562       }
563     }
564     else if (ob==diweiter[sn]) {
565       remove_di(sn);
566       di_weiter(0);
567     }
568     else if (ob==diwiederweiter) {
569       remove_di(sn);
570       clr_desk(0);
571       skatopen=0;
572       if (bt==1) di_wieder(sn,0);
573       else phase=GEBEN;
574     }
575     else if (ob==dischieben) {
576       remove_di(sn);
577       if (bt==2) {
578 	draw_skat(spieler);
579 	put_fbox(spieler,TX_FERTIG);
580 	drbut=spieler+1;
581       }
582       else {
583 	di_verdoppelt(0,0);
584       }
585     }
586     else if (ob==diklopfen) {
587       remove_di(sn);
588       if (bt==3) {
589 	vmh=left(vmh);
590 	if (vmh) di_schieben();
591 	else start_ramsch();
592       }
593       else {
594 	di_verdoppelt(0,1);
595       }
596     }
597     else if (ob==dischenken) {
598       remove_di(sn);
599       if (bt==3) {
600 	di_nichtschenken(sn);
601       }
602       else {
603 	di_geschenkt();
604       }
605     }
606     else if (ob==digeschenkt || ob==diendeschenken) {
607       remove_di(sn);
608       if (bt==4) {
609 	schenkstufe++;
610 	if (schnang && schenkstufe==2) schenkstufe++;
611 	if (schenkstufe<3) schnang=1;
612 	else schwang=1;
613 	diwiederschenken[2].str=
614 	  &textarr[schwang?TX_SCHW_ANGE:TX_SCHN_ANGE];
615 	di_wiederschenken(schenknext,1);
616       }
617       else {
618 	finishgame();
619       }
620     }
621     else if (ob==diwiederschenken) {
622       remove_di(sn);
623       if (bt==4) {
624 	di_nichtschenken(sn);
625       }
626       else {
627 	if (schenknext!=-1) {
628 	  di_wiederschenken(schenknext,0);
629 	}
630 	else {
631 	  schenknext=sn;
632 	  sn=left(sn)==spieler?left(spieler):left(sn);
633 	  if (!iscomp(sn)) schenknext=sn;
634 	  di_geschenkt();
635 	}
636       }
637     }
638     else if (ob==dinichtschenken) {
639       remove_di(sn);
640       if (schenkstufe==1) schenkstufe=0;
641       phase=SPIELEN;
642     }
643     else if (ob==diverdoppelt) {
644       remove_di(sn);
645       di_verdoppelt(1,0);
646     }
647     else if (ob==dibuben) {
648       remove_di(sn);
649     }
650     else if (ob==diresult) {
651       remove_di(sn);
652       clr_desk(0);
653       if (bt==20) di_ende(sn);
654       else if (bt==22) di_proto(sn,1,0);
655       else if (bt==21) di_wieder(sn,1);
656       else phase=GEBEN;
657     }
658     else if (ob==diwieder) {
659       remove_di(sn);
660       vorhandwn=diwieder[10].spec&OB_SELECTED?1:0;
661       if (bt==11) {
662 	di_resultdi(sn);
663       }
664       else {
665 	if (diwieder[5].spec&OB_SELECTED) {
666 	  wieder=1;
667 	}
668 	else if (diwieder[6].spec&OB_SELECTED) {
669 	  wieder=2;
670 	}
671 	else {
672 	  wieder=3;
673 	}
674 	phase=GEBEN;
675       }
676     }
677     else if (ob==diproto[sn]) {
678       remove_di(sn);
679       if (bt==49) {
680 	protsort[sn]^=1;
681 	di_proto(sn,0,0);
682 	actbtn[sn]=49;
683       }
684       else if (bt==47) {
685 	if ((sn && !irc_play) || !protsort[sn]) di_liste(sn,1);
686 	else {
687 	  di_proto(sn,1,1);
688 	  if (phase==RESULT) di_resultdi(sn);
689 	}
690       }
691       else if (phase==RESULT) di_resultdi(sn);
692     }
693     else if (ob==diliste[sn]) {
694       remove_di(sn);
695       if (bt==62) {
696 	splfirst[sn]-=12;
697 	di_liste(sn,0);
698 	actbtn[sn]=splfirst[sn]?62:65;
699       }
700       else if (bt==63) {
701 	alist[sn]=(alist[sn]+1)%3;
702 	if (!sn) save_opt();
703 	di_liste(sn,splfirst[sn]+12>=splstp);
704 	actbtn[sn]=63;
705       }
706       else if (bt==65) {
707 	if (splfirst[sn]+12>=splstp) {
708 	  di_loesch(sn);
709 	}
710 	else {
711 	  if (splfirst[sn]+12<splstp) {
712 	    splfirst[sn]+=12;
713 	    di_liste(sn,0);
714 	  }
715 	  else {
716 	    di_liste(sn,1);
717 	  }
718 	  actbtn[sn]=splfirst[sn]+12<splstp?65:62;
719 	}
720       }
721       else if (phase==RESULT) di_resultdi(sn);
722     }
723     else if (ob==dioptions[sn]) {
724       remove_di(sn);
725       s1=dioptions[sn][4].spec&OB_SELECTED?1:0;
726       al=dioptions[sn][6].spec&OB_SELECTED?1:0;
727       s2=dioptions[sn][8].spec&OB_SELECTED?1:0;
728       sav=sort1[sn]+2*alternate[sn];
729       if (s1!=sort1[sn] || s2!=sort2[sn] || al!=alternate[sn]) {
730 	sort1[sn]=s1;
731 	sort2[sn]=s2;
732 	alternate[sn]=al;
733 	if (irc_play) irc_sendsort(sn);
734 	initscr(sn,1);
735 	if (sav!=sort1[sn]+2*alternate[sn] && !irc_play) save_opt();
736       }
737       if (bt==21) di_ende(sn);
738       else if (bt==19 && splres) di_proto(sn,1,0);
739       else if (bt==19) di_liste(sn,1);
740       else if (bt==20) di_grafik(sn);
741       else if (bt==17) {
742 	if (irc_play) irc_sendschenken(sn);
743 	di_schenken(sn);
744       }
745       else if (bt==18) di_mehrspieler(sn);
746       else if (bt==2) di_copyr(sn);
747     }
748     else if (ob==dicopyr[sn] || ob==dicopyralt[sn]) {
749       remove_di(sn);
750       if (dlhintseen!=2 || firstgame) {
751 	di_options(!sn && firstgame?-1:sn);
752       }
753       if (!sn) dlhintseen=1;
754     }
755     else if (ob==digrafik[sn]) {
756       sav=blatt[sn]+4*lang[sn];
757       ag=0;
758       if (!(digrafik[sn][8+lang[sn]].spec&OB_SELECTED)) {
759 	remove_di(sn);
760 	lang[sn]^=1;
761 	if (phase==REIZEN) {
762 	  lastmsaho[sn]=0;
763 	  if (saho) do_msagen(sager,reizw[reizp]);
764 	  else do_mhoeren(hoerer);
765 	}
766 	if (drbut==sn+1) {
767 	  put_fbox(sn,TX_DRUECKEN);
768 	}
769 	ag=1;
770       }
771       if (!(digrafik[sn][3+blatt[sn]].spec&OB_SELECTED) ||
772 	  (sav/4!=lang[sn] && blatt[sn]<2)) {
773 	if (!ag) remove_di(sn);
774 	blatt[sn]=(digrafik[sn][3].spec&OB_SELECTED?0:
775 		   digrafik[sn][4].spec&OB_SELECTED?1:
776 		   digrafik[sn][5].spec&OB_SELECTED?2:3);
777 	for (i=0;i<33;i++) {
778 	  create_card(sn,i-1);
779 	}
780 	ag=1;
781       }
782       if (ag) {
783 	initscr(sn,2);
784 	setcurs(sn+1);
785 	if (resdial[sn]) {
786 	  XUnmapWindow(dpy[sn],resdial[sn][0].win);
787 	  XMapWindow(dpy[sn],resdial[sn][0].win);
788 	}
789 	set_conames();
790 	if (sav!=blatt[sn]+4*lang[sn] && !irc_play) save_opt();
791 	di_grafik(sn);
792       }
793       if (bt==11) {
794 	di_input(sn,TX_NAME,4,usrname[0],9);
795       }
796       else if (bt==12) {
797 	di_input(sn,TX_NAME,4,usrname[1],9);
798       }
799       else if (bt==13) {
800 	set_conames();
801 	if (sav!=blatt[sn]+4*lang[sn] && !irc_play) save_opt();
802 	di_strateg(sn);
803       }
804     }
805     else if (ob==distrateg[sn]) {
806       remove_di(sn);
807       for (i=0;i<2;i++) stg[i]=strateg[i];
808       for (i=-4;i<=0;i++) {
809 	if (distrateg[sn][i+8].spec&OB_SELECTED) {
810 	  stg[0]=i;
811 	}
812 	if (distrateg[sn][i+14].spec&OB_SELECTED) {
813 	  stg[1]=i;
814 	}
815       }
816       sav=0;
817       for (i=0;i<2;i++) {
818 	if (stg[i]!=strateg[i]) {
819 	  strateg[i]=stg[i];
820 	  sav=1;
821 	}
822       }
823       if (distrateg[sn][16].spec&OB_SELECTED) {
824 	if (hints[sn]) {
825 	  hints[sn]=0;
826 	  if (hintcard[0]!=-1) {
827 	    if (phase==SPIELEN && sn==(ausspl+vmh)%3) {
828 	      show_hint(sn,0,0);
829 	    }
830 	    else if (phase==DRUECKEN && sn==spieler) {
831 	      show_hint(sn,0,0);
832 	      show_hint(sn,1,0);
833 	    }
834 	  }
835 	  sav=1;
836 	}
837       }
838       else {
839 	if (!hints[sn]) {
840 	  hints[sn]=1;
841 	  if (hintcard[0]!=-1) {
842 	    if (phase==SPIELEN && sn==(ausspl+vmh)%3) {
843 	      show_hint(sn,0,1);
844 	    }
845 	    else if (phase==DRUECKEN && sn==spieler) {
846 	      show_hint(sn,0,1);
847 	      show_hint(sn,1,1);
848 	    }
849 	  }
850 	  sav=1;
851 	}
852       }
853       if (bt>=19 && bt<=22) {
854 	di_input(sn,TX_NAME,3,conames[1-(bt&1)][(bt-19)/2],9);
855       }
856       else {
857 	set_conames();
858 	if (sav && !irc_play) save_opt();
859 	di_varianten(sn);
860       }
861     }
862     else if (ob==divarianten[sn]) {
863       remove_di(sn);
864       sav=(((((((playramsch
865 		 )*3+playkontra
866 		)*3+playbock
867 	       )*3+spitzezaehlt
868 	      )*2+revolution
869 	     )*2+klopfen
870 	    )*2+schenken
871 	   )*2+oldrules;
872       for (i=0;i<3;i++) {
873 	if (divarianten[sn][3+i].spec&OB_SELECTED) {
874 	  playramsch=i;
875 	}
876 	if (divarianten[sn][7+i].spec&OB_SELECTED) {
877 	  playkontra=i;
878 	}
879 	if (divarianten[sn][11+i].spec&OB_SELECTED) {
880 	  playbock=i;
881 	}
882 	if (divarianten[sn][15+i].spec&OB_SELECTED) {
883 	  spitzezaehlt=i;
884 	}
885       }
886       revolution=!(divarianten[sn][19].spec&OB_SELECTED);
887       klopfen=!(divarianten[sn][22].spec&OB_SELECTED);
888       schenken=!(divarianten[sn][25].spec&OB_SELECTED);
889       oldrules=!(divarianten[sn][28].spec&OB_SELECTED);
890       if (sav!=(((((((playramsch
891 		      )*3+playkontra
892 		     )*3+playbock
893 		    )*3+spitzezaehlt
894 		   )*2+revolution
895 		  )*2+klopfen
896 		 )*2+schenken
897 		)*2+oldrules) {
898 	save_opt();
899       }
900       if (playramsch) di_ramschopts(sn);
901       else if (playbock) di_bockevents(sn);
902       else di_geschwindigkeit(sn);
903     }
904     else if (ob==diramschopts[sn]) {
905       remove_di(sn);
906       sav=playsramsch*2+rskatloser;
907       playsramsch=!(diramschopts[sn][3].spec&OB_SELECTED);
908       rskatloser=!(diramschopts[sn][6].spec&OB_SELECTED);
909       if (sav!=playsramsch*2+rskatloser) save_opt();
910       if (playbock) di_bockevents(sn);
911       else di_geschwindigkeit(sn);
912     }
913     else if (ob==dibockevents[sn]) {
914       remove_di(sn);
915       sav=bockevents*2+resumebock;
916       bockevents=0;
917       for (i=1,j=0;i<=BOCK_BEI_LAST;i*=2,j++) {
918 	if (dibockevents[sn][2+j].spec&OB_SELECTED) {
919 	  bockevents+=i;
920 	}
921       }
922       resumebock=!(dibockevents[sn][11].spec&OB_SELECTED);
923       if (sav!=bockevents*2+resumebock) save_opt();
924       di_geschwindigkeit(sn);
925     }
926     else if (ob==digeschwindigkeit[sn]) {
927       sav=(nimmstich[sn][0]*3+abkuerz[sn])*2+fastdeal;
928       digeschwindigkeit[sn][bt].spec&=~OB_SELECTED;
929       switch (bt) {
930       case 4:
931 	nimmstich[sn][0]=0;
932 	break;
933       case 5:
934 	if (nimmstich[sn][0]==101) nimmstich[sn][0]--;
935 	else nimmstich[sn][0]-=10;
936 	break;
937       case 6:
938 	nimmstich[sn][0]--;
939 	break;
940       case 7:
941 	nimmstich[sn][0]++;
942 	if (irc_play && nimmstich[sn][0]>=101) nimmstich[sn][0]=100;
943 	break;
944       case 8:
945 	nimmstich[sn][0]+=10;
946 	if (irc_play && nimmstich[sn][0]>=101) nimmstich[sn][0]=100;
947 	break;
948       case 9:
949 	if (irc_play) nimmstich[sn][0]=100;
950 	else nimmstich[sn][0]=101;
951 	break;
952       }
953       if (nimmstich[sn][0]<0) nimmstich[sn][0]=0;
954       else if (nimmstich[sn][0]>101) nimmstich[sn][0]=101;
955       fastdeal=digeschwindigkeit[sn][11].spec&OB_SELECTED?1:0;
956       abkuerz[sn]=(digeschwindigkeit[sn][14].spec&OB_SELECTED?0:
957 		   digeschwindigkeit[sn][15].spec&OB_SELECTED?1:2);
958       if (sav!=(nimmstich[sn][0]*3+abkuerz[sn])*2+fastdeal &&
959 	  !irc_play) save_opt();
960       prverz(sn);
961       if (bt==17) {
962 	remove_di(sn);
963 	if (!irc_play && numsp==1) di_mehrspieler(sn);
964 	else di_eingabe(sn);
965       }
966       else {
967 	draw_di(sn,3);
968 	draw_di(sn,bt);
969       }
970     }
971     else if (ob==dimehrspieler) {
972       if (bt==2) di_lanspiel(sn);
973       else if (bt==3) di_irc(sn);
974       else if (bt==4) {
975 	manpage("xskat");
976 	dimehrspieler[bt].spec&=~OB_SELECTED;
977 	draw_di(sn,bt);
978       }
979       else di_eingabe(sn);
980     }
981     else if (ob==dilanspiel) {
982       if (bt==2) di_eigenertisch(sn);
983       else if (bt==3) di_anderertisch(sn);
984       else di_mehrspieler(sn);
985     }
986     else if (ob==dieigenertisch) {
987       sav=laninvite[0]*2+laninvite[1];
988       laninvite[0]=!(dieigenertisch[4].spec&OB_SELECTED);
989       laninvite[1]=!(dieigenertisch[9].spec&OB_SELECTED);
990       if (sav!=laninvite[0]*2+laninvite[1]) save_opt();
991       if (bt==13) di_lanspiel(sn);
992       else if (!laninvite[0] && !laninvite[1]) {
993 	di_eigenertisch(sn);
994       }
995       else if (bt==6) {
996 	di_input(sn,TX_RECHNER_IP,0,lanip[1],35);
997       }
998       else if (bt==11) {
999 	di_input(sn,TX_RECHNER_IP,0,lanip[2],35);
1000       }
1001       else di_warteauf(sn,0,0,0);
1002     }
1003     else if (ob==dianderertisch) {
1004       if (bt==4) {
1005 	di_input(sn,TX_RECHNER_IP,1,lanip[0],35);
1006       }
1007       else if (bt==7) {
1008 	manpage("xhost");
1009 	dianderertisch[bt].spec&=~OB_SELECTED;
1010 	draw_di(sn,bt);
1011       }
1012       else if (bt==9) {
1013 	xstoreres();
1014 	exitus(0);
1015       }
1016       else di_lanspiel(sn);
1017     }
1018     else if (ob==diwarteauf) {
1019       di_eigenertisch(sn);
1020     }
1021     else if (ob==diirc) {
1022       if (bt==7) di_mehrspieler(sn);
1023       else if (bt==3) {
1024 	di_input(sn,TX_RECHNER_IP,2,irc_hostname,35);
1025       }
1026       else if (bt==6) {
1027 	manpage("xskat");
1028 	diirc[bt].spec&=~OB_SELECTED;
1029 	draw_di(sn,bt);
1030       }
1031       else {
1032 	if (!fork()) startirc(1);
1033 	exitus(0);
1034       }
1035     }
1036     else if (ob==digui[sn]) {
1037       remove_di(sn);
1038       sav=(((mbutton[sn]
1039 	     )*3+keyboard[sn]
1040 	    )*2+briefmsg[sn]
1041 	   )*2+trickl2r[sn];
1042       for (i=0;i<=5;i++) {
1043 	if (digui[sn][3+i].spec&OB_SELECTED) {
1044 	  mbutton[sn]=i;
1045 	}
1046       }
1047       for (i=0;i<3;i++) {
1048 	if (digui[sn][10+i].spec&OB_SELECTED) {
1049 	  keyboard[sn]=i;
1050 	}
1051       }
1052       briefmsg[sn]=!(digui[sn][14].spec&OB_SELECTED);
1053       trickl2r[sn]=!(digui[sn][17].spec&OB_SELECTED);
1054       if (sav!=(((mbutton[sn]
1055 		  )*3+keyboard[sn]
1056 		 )*2+briefmsg[sn]
1057 		)*2+trickl2r[sn] && !irc_play) save_opt();
1058     }
1059   }
1060 }
1061 
button_press(sn,bt,ob)1062 VOID button_press(sn,bt,ob)
1063 int sn,bt;
1064 OBJECT *ob;
1065 {
1066   if (irc_play &&
1067       ob!=diende[sn] &&
1068       ob!=diterm[sn] &&
1069       ob!=diproto[sn] &&
1070       ob!=diliste[sn] &&
1071       ob!=diloesch &&
1072       ob!=dioptions[sn] &&
1073       ob!=dicopyr[sn] &&
1074       ob!=dicopyralt[sn] &&
1075       ob!=digrafik[sn] &&
1076       ob!=distrateg[sn] &&
1077       ob!=divarianten[sn] &&
1078       ob!=diramschopts[sn] &&
1079       ob!=dibockevents[sn] &&
1080       ob!=digeschwindigkeit[sn] &&
1081       ob!=digui[sn]) irc_sendbtev(sn,bt);
1082   hndl_btevent(sn,bt);
1083 }
1084 
draw_wedge(w,bp,sn,f,x,y,s)1085 VOID draw_wedge(w,bp,sn,f,x,y,s)
1086 Drawable w;
1087 unsigned long bp;
1088 int sn,f,x,y,s;
1089 {
1090   int i,a,b,c;
1091 
1092   a=s&1?-1:1;
1093   b=s&2?-1:1;
1094   c=s&4?desk[sn].large?20:13:1;
1095   change_gc(sn,f?mkpix[sn]:bp,gc);
1096   for (i=0;i<=6;i++) {
1097     XDrawPoint(dpy[sn],w,gc[sn],x,y+b*(2*i));
1098     XDrawPoint(dpy[sn],w,gc[sn],x+a*1,y+b*(2*i+1));
1099   }
1100   for (i=0;i<=c;i++) {
1101     XDrawPoint(dpy[sn],w,gc[sn],x+a*(2*i+2),y);
1102     XDrawPoint(dpy[sn],w,gc[sn],x+a*(2*i+1),y+b*1);
1103   }
1104   change_gc(sn,f?wpix[sn]:bp,gc);
1105   for (i=0;i<=6;i++) {
1106     XDrawPoint(dpy[sn],w,gc[sn],x,y+b*(2*i+1));
1107     XDrawPoint(dpy[sn],w,gc[sn],x+a*1,y+b*(2*i));
1108   }
1109   for (i=0;i<=c;i++) {
1110     XDrawPoint(dpy[sn],w,gc[sn],x+a*(2*i+1),y);
1111     XDrawPoint(dpy[sn],w,gc[sn],x+a*(2*i+2),y+b*1);
1112   }
1113   change_gc(sn,fgpix[sn],gc);
1114 }
1115 
draw_actbtn(sn,f)1116 VOID draw_actbtn(sn,f)
1117 int sn,f;
1118 {
1119   OBJECT *ob;
1120   unsigned long bp;
1121   int bt,d,e,w,h;
1122 
1123   if (f && !keyboard[sn]) actbtn[sn]=0;
1124   ob=actdial[sn];
1125   bt=actbtn[sn];
1126   if (bt && ob) {
1127     bp=gfx3d[sn] || !(ob[bt].spec&OB_SELECTED)?btpix[sn]:fgpix[sn];
1128     d=gfx3d[sn]?ob[bt].spec&OB_EXIT?2:1:0;
1129     e=gfx3d[sn]?ob[bt].spec&OB_EXIT?1:2:2;
1130     w=ob[bt].w*charw[sn];
1131     h=ob[bt].h*charh[sn];
1132     draw_wedge(ob[bt].win,bp,sn,f,d,d,0);
1133     draw_wedge(ob[bt].win,bp,sn,f,w-e,d,1);
1134     draw_wedge(ob[bt].win,bp,sn,f,d,h-e,2);
1135     draw_wedge(ob[bt].win,bp,sn,f,w-e,h-e,3);
1136   }
1137 }
1138 
draw_selpos(sn,f)1139 VOID draw_selpos(sn,f)
1140 int sn,f;
1141 {
1142   unsigned long bp;
1143   int p,s;
1144 
1145   if (selpos[sn].num) {
1146     p=selpos[sn].act;
1147     if (selpos[sn].p[p].f&1) {
1148       bp=btpix[sn];
1149       s=0;
1150     }
1151     else if (selpos[sn].p[p].f&2) {
1152       bp=bgpix[sn];
1153       s=4;
1154     }
1155     else {
1156       return;
1157     }
1158     draw_wedge(win[sn],bp,sn,f,selpos[sn].p[p].x1,selpos[sn].p[p].y1,s);
1159     draw_wedge(win[sn],bp,sn,f,selpos[sn].p[p].x2,selpos[sn].p[p].y1,s+1);
1160     draw_wedge(win[sn],bp,sn,f,selpos[sn].p[p].x1,selpos[sn].p[p].y2,s+2);
1161     draw_wedge(win[sn],bp,sn,f,selpos[sn].p[p].x2,selpos[sn].p[p].y2,s+3);
1162     draw_wedge(bck[sn],bp,sn,f,selpos[sn].p[p].x1,selpos[sn].p[p].y1,s);
1163     draw_wedge(bck[sn],bp,sn,f,selpos[sn].p[p].x2,selpos[sn].p[p].y1,s+1);
1164     draw_wedge(bck[sn],bp,sn,f,selpos[sn].p[p].x1,selpos[sn].p[p].y2,s+2);
1165     draw_wedge(bck[sn],bp,sn,f,selpos[sn].p[p].x2,selpos[sn].p[p].y2,s+3);
1166   }
1167 }
1168 
new_selpos(sn,dir)1169 VOID new_selpos(sn,dir)
1170 int sn,dir;
1171 {
1172   draw_selpos(sn,0);
1173   selpos[sn].act=(selpos[sn].act+dir+selpos[sn].num)%selpos[sn].num;
1174   draw_selpos(sn,1);
1175 }
1176 
new_actbtn(sn,dir)1177 VOID new_actbtn(sn,dir)
1178 int sn,dir;
1179 {
1180   OBJECT *ob;
1181   int bt;
1182 
1183   if (selpos[sn].num) {
1184     new_selpos(sn,dir);
1185     return;
1186   }
1187   draw_actbtn(sn,0);
1188   ob=actdial[sn];
1189   bt=actbtn[sn];
1190   if (bt && ob) {
1191     if (!dir) {
1192       if (ob[bt].next!=OB_NONE) {
1193 	actbtn[sn]+=ob[bt].next;
1194       }
1195       if (ob==dispiel) {
1196 	actbtn[sn]=12;
1197       }
1198     }
1199     else {
1200       for (;;) {
1201 	bt+=dir;
1202 	if (bt==ob[0].spec) bt=1;
1203 	else if (!bt) bt=ob[0].spec-1;
1204 	if (ob[bt].spec&(OB_BUTTON|OB_EXIT) &&
1205 	    !ob_disabled(ob,bt) &&
1206 	    !(ob[bt].spec&OB_HIDDEN) &&
1207 	    (!(ob[bt].spec&OB_SELECTED) ||
1208 	     ob[bt].next==OB_NONE)) {
1209 	  actbtn[sn]=bt;
1210 	  break;
1211 	}
1212       }
1213     }
1214   }
1215   draw_actbtn(sn,1);
1216 }
1217 
set_selpos(sn)1218 VOID set_selpos(sn)
1219 int sn;
1220 {
1221   int i,j,k,n;
1222   static int tc[3],ph[3];
1223   static long gn[3];
1224 
1225   if (selpos[sn].num || actdial[sn] || !keyboard[sn]) return;
1226   if (selpos[sn].act==-1 || !(selpos[sn].p[selpos[sn].act].f&4) ||
1227       gn[sn]!=gamenr || ph[sn]!=phase) {
1228     selpos[sn].act=0;
1229     n=1;
1230   }
1231   else n=0;
1232   if (phase==REIZEN) {
1233     if ((saho && sn==sager) || (!saho && sn==hoerer)) {
1234       selpos[sn].num=2;
1235       for (i=0;i<2;i++) {
1236 	selpos[sn].p[i].x1=desk[sn].pboxx+i*desk[sn].cardw+4;
1237 	selpos[sn].p[i].y1=desk[sn].pboxy+1;
1238 	selpos[sn].p[i].x2=desk[sn].pboxx+(i+1)*desk[sn].cardw-5;
1239 	selpos[sn].p[i].y2=desk[sn].pboxy+charh[sn]-gfx3d[sn]-1;
1240 	selpos[sn].p[i].f=1;
1241       }
1242     }
1243   }
1244   else if (phase==DRUECKEN) {
1245     if (sn==spieler) {
1246       if (n) {
1247 	selpos[sn].act=6;
1248       }
1249       if (hints[sn] && hintcard[0]!=-1) {
1250 	selpos[sn].act=0;
1251 	if (hintcard[0]<30) selpos[sn].act=hintcard[0]-10*sn+1;
1252 	if (hintcard[1]<30) selpos[sn].act=hintcard[1]-10*sn+1;
1253       }
1254       selpos[sn].num=11;
1255       i=0;
1256       selpos[sn].p[i].x1=desk[sn].pboxx+24*desk[sn].f/desk[sn].q+4;
1257       selpos[sn].p[i].y1=desk[sn].pboxy+1;
1258       selpos[sn].p[i].x2=desk[sn].pboxx+104*desk[sn].f/desk[sn].q-5;
1259       selpos[sn].p[i].y2=desk[sn].pboxy+charh[sn]-gfx3d[sn]-1;
1260       selpos[sn].p[i].f=1;
1261       for (i=1;i<11;i++) {
1262 	selpos[sn].p[i].x1=desk[sn].playx+(i-1)*desk[sn].cardx;
1263 	selpos[sn].p[i].y1=desk[sn].playy-2;
1264 	selpos[sn].p[i].x2=desk[sn].playx+i*desk[sn].cardx-1-desk[sn].large*2;
1265 	selpos[sn].p[i].y2=desk[sn].playy+desk[sn].cardh+1-desk[sn].large;
1266 	selpos[sn].p[i].f=2|4;
1267       }
1268     }
1269   }
1270   else if (phase==SPIELEN) {
1271     if (sn==(ausspl+vmh)%3) {
1272       computer();
1273       if (actdial[sn] || keyboard[sn]!=2) return;
1274       calc_poss(sn);
1275       selpos[sn].num=possc;
1276       i=0;
1277       for (k=0;k<10;k++) {
1278 	for (j=0;j<possc;j++) {
1279 	  if (possi[j]%10==k) {
1280 	    if (hints[sn] && hintcard[0]==possi[j]) {
1281 	      selpos[sn].act=i;
1282 	    }
1283 	    selpos[sn].p[i].x1=desk[sn].playx+k*desk[sn].cardx;
1284 	    selpos[sn].p[i].y1=desk[sn].playy-2;
1285 	    selpos[sn].p[i].x2=desk[sn].playx+(k+1)*desk[sn].cardx-
1286 	      1-desk[sn].large*2;
1287 	    selpos[sn].p[i].y2=desk[sn].playy+desk[sn].cardh+1-desk[sn].large;
1288 	    selpos[sn].p[i].f=2;
1289 	    i++;
1290 	    break;
1291 	  }
1292 	}
1293       }
1294     }
1295   }
1296   else if (phase==NIMMSTICH) {
1297     if (nimmstich[sn][1]) {
1298       selpos[sn].num=1;
1299       selpos[sn].p[0].f=0;
1300       selpos[sn].p[0].x1=0;
1301       selpos[sn].p[0].y1=0;
1302     }
1303   }
1304   else if (phase==REVOLUTION) {
1305     if (sn==tauschply) {
1306       if (tauschcard!=-1) {
1307 	j=tauschcard%10;
1308 	if (tauschcard/10!=sn) j+=10;
1309       }
1310       else j=-1;
1311       if (!n) {
1312 	if (tc[sn]!=-1 && selpos[sn].act>=tc[sn]+1) {
1313 	  selpos[sn].act++;
1314 	}
1315 	if (j!=-1) {
1316 	  if (selpos[sn].act>j+1) {
1317 	    selpos[sn].act--;
1318 	  }
1319 	  else if (selpos[sn].act==j+1) {
1320 	    selpos[sn].act=j%10*2+10-j+(j/10);
1321 	  }
1322 	}
1323       }
1324       selpos[sn].num=20+(j==-1);
1325       i=0;
1326       selpos[sn].p[i].x1=desk[sn].pboxx+24*desk[sn].f/desk[sn].q+4;
1327       selpos[sn].p[i].y1=desk[sn].pboxy+1;
1328       selpos[sn].p[i].x2=desk[sn].pboxx+104*desk[sn].f/desk[sn].q-5;
1329       selpos[sn].p[i].y2=desk[sn].pboxy+charh[sn]-gfx3d[sn]-1;
1330       selpos[sn].p[i].f=1;
1331       i++;
1332       for (k=0;k<20;k++) {
1333 	if (k==j) continue;
1334 	selpos[sn].p[i].x1=desk[sn].playx+k%10*desk[sn].cardx;
1335 	selpos[sn].p[i].y1=(k>9?desk[sn].skaty:desk[sn].playy)-2;
1336 	selpos[sn].p[i].x2=desk[sn].playx+(k%10+1)*desk[sn].cardx-
1337 	  1-desk[sn].large*2;
1338 	selpos[sn].p[i].y2=(k>9?desk[sn].skaty:desk[sn].playy)+
1339 	  desk[sn].cardh+1-desk[sn].large;
1340 	selpos[sn].p[i].f=2|4;
1341 	i++;
1342       }
1343       tc[sn]=j;
1344     }
1345   }
1346   draw_selpos(sn,1);
1347   gn[sn]=gamenr;
1348   ph[sn]=phase;
1349 }
1350 
del_selpos(sn)1351 VOID del_selpos(sn)
1352 int sn;
1353 {
1354   draw_selpos(sn,0);
1355   selpos[sn].num=0;
1356 }
1357 
manpage(subj)1358 VOID manpage(subj)
1359 char *subj;
1360 {
1361   if (!fork()) {
1362     execlp("xterm","xterm","-e","man",subj,NULL);
1363     fprintf(stderr,"xterm not found\n");
1364     exitus(0);
1365   }
1366 }
1367 
polldisps()1368 VOID polldisps()
1369 {
1370   static int tim;
1371   Display *d;
1372   char dn[2][80];
1373   int i,ok,s[2];
1374   char *argv[100];
1375 
1376   if (++tim>20) tim=0;
1377   if (tim) return;
1378   ok=1;
1379   for (i=0;i<2;i++) {
1380     if ((s[i]=laninvite[i])) {
1381       strcpy(dn[i],lanip[i+1]);
1382       if (!strchr(dn[i],':')) {
1383 	strcat(dn[i],":0");
1384       }
1385       if ((d=XOpenDisplay(dn[i]))) {
1386 	if (!XGetDefault(d,prog_name,"ready")) ok=0;
1387 	else s[i]=0;
1388 	XCloseDisplay(d);
1389       }
1390       else ok=0;
1391     }
1392   }
1393   if (ok) {
1394     for (i=0;i<90 && i<theargc;i++) {
1395       argv[i]=theargv[i];
1396     }
1397     if (laninvite[0]) argv[i++]=dn[0];
1398     if (laninvite[1]) argv[i++]=dn[1];
1399     argv[i]=0;
1400     execvp(argv[0],argv);
1401     fprintf(stderr,"%s not found\n",argv[0]);
1402     exitus(0);
1403   }
1404   di_warteauf(0,1,s[0],s[1]);
1405 }
1406 
hndl_events()1407 VOID hndl_events()
1408 {
1409   int sn,b,x,y,i,opt,bt;
1410   XEvent event;
1411   KeySym keysym;
1412   char buf[100],*l;
1413   OBJECT *ob;
1414   static int sl,sr;
1415 
1416   if (!lost[0] && !lost[1] && !lost[2]) setcurs(0);
1417   waitt(50,1);
1418   for (sn=0;sn<numsp;sn++) {
1419     if (irc_play && irc_pos!=sn) continue;
1420     b=x=y=opt=0;
1421     set_selpos(sn);
1422     while (!lost[sn] && XCheckMaskEvent(dpy[sn],~0,&event)) {
1423       ob=actdial[sn];
1424       switch (event.type) {
1425       case KeyRelease:
1426 	keysym=XLookupKeysym((XKeyEvent *)&event,0);
1427 	if (keysym==XK_Shift_L) sl=0;
1428 	else if (keysym==XK_Shift_R) sr=0;
1429 	break;
1430       case KeyPress:
1431 	i=XLookupString((XKeyEvent *)&event,buf,sizeof(buf)-1,
1432 			&keysym,(XComposeStatus *)0);
1433 	if (keysym==XK_Shift_L) sl=1;
1434 	else if (keysym==XK_Shift_R) sr=1;
1435 	if (keysym==XK_F6 && pkoption!=1) {
1436 	  if (!pkoption) pkoption=2;
1437 	  else if (pkoption!=4) pkoption++;
1438 	}
1439 	if (!ob &&
1440 	    (keysym==XK_Escape ||
1441 	     keysym==XK_F1)) {
1442 	  b=sn+1;
1443 	  opt=2;
1444 	}
1445 	else if (i && irc_state==IRC_PLAYING && irc_xinput(buf,i));
1446 	else if (ob || selpos[sn].num) {
1447 	  if (ob==diinput[sn] &&
1448 	      ((i==1 && (unsigned int)buf[0]>=' ') ||
1449 	       keysym==XK_BackSpace || keysym==XK_Delete)) {
1450 	    buf[1]=0;
1451 	    if (keysym==XK_BackSpace || keysym==XK_Delete) {
1452 	      if (strlen(inputbuf[sn])>1) {
1453 		inputbuf[sn][strlen(inputbuf[sn])-2]='_';
1454 		inputbuf[sn][strlen(inputbuf[sn])-1]=0;
1455 	      }
1456 	    }
1457 	    else if (strlen(inputbuf[sn])-1<inputlen[sn]) {
1458 	      inputbuf[sn][strlen(inputbuf[sn])-1]=0;
1459 	      strcat(inputbuf[sn],buf);
1460 	      strcat(inputbuf[sn],"_");
1461 	    }
1462 	    if (actbtn[sn]!=4) {
1463 	      actbtn[sn]=4;
1464 	      draw_di(sn,3);
1465 	      draw_di(sn,4);
1466 	    }
1467 	    draw_di(sn,2);
1468 	  }
1469 	  else if ((keysym==XK_Tab && !sr && !sl) ||
1470 	      (keysym==XK_KP_Tab && !sr && !sl) ||
1471 	      keysym==XK_Right ||
1472 	      keysym==XK_Down ||
1473 	      keysym==XK_KP_Right ||
1474 	      keysym==XK_KP_Down ||
1475 	      keysym==osfXK_Right ||
1476 	      keysym==osfXK_Down) {
1477 	    new_actbtn(sn,1);
1478 	  }
1479 	  else if ((keysym==XK_Tab && sr+sl) ||
1480 		   (keysym==XK_KP_Tab && sr+sl) ||
1481 		   keysym==XK_3270_BackTab ||
1482 		   keysym==XK_ISO_Left_Tab ||
1483 		   keysym==hpXK_BackTab ||
1484 		   keysym==hpXK_KP_BackTab ||
1485 		   keysym==osfXK_BackTab ||
1486 		   keysym==XK_Left ||
1487 		   keysym==XK_Up ||
1488 		   keysym==XK_KP_Left ||
1489 		   keysym==XK_KP_Up ||
1490 		   keysym==osfXK_Left ||
1491 		   keysym==osfXK_Up) {
1492 	    new_actbtn(sn,-1);
1493 	  }
1494 	  else if (keysym==XK_Return ||
1495 		   keysym==XK_KP_Enter ||
1496 		   keysym==XK_space ||
1497 		   keysym==XK_Escape ||
1498 		   keysym==XK_F1) {
1499 	    if (ob && actbtn[sn]) {
1500 	      button_press(sn,actbtn[sn],ob);
1501 	      new_actbtn(sn,0);
1502 	    }
1503 	    else if (selpos[sn].num) {
1504 	      i=selpos[sn].act;
1505 	      del_selpos(sn);
1506 	      hndl_button(sn,selpos[sn].p[i].x1+2,selpos[sn].p[i].y1+2,0,1);
1507 	    }
1508 	  }
1509 	}
1510 	break;
1511       case ButtonPress:
1512 	if (ob) {
1513 	  for (bt=1;bt<ob[0].spec;bt++) {
1514 	    if (event.xbutton.window==ob[bt].win &&
1515 		ob[bt].spec&(OB_BUTTON|OB_EXIT)) {
1516 	      button_press(sn,bt,ob);
1517 	      break;
1518 	    }
1519 	  }
1520 	}
1521 	else {
1522 	  b=sn+1;
1523 	  x=event.xbutton.x;
1524 	  y=event.xbutton.y;
1525 	  opt=(mbutton[sn] && mbutton[sn]==event.xbutton.button)?2
1526 	    :!mbutton[sn]?1:0;
1527 	}
1528 	break;
1529       case Expose:
1530 	if (event.xexpose.window==win[sn]) {
1531 	  XCopyArea(dpy[sn],bck[sn],win[sn],gc[sn],
1532 		    event.xexpose.x,event.xexpose.y,
1533 		    event.xexpose.width,event.xexpose.height,
1534 		    event.xexpose.x,event.xexpose.y);
1535 	}
1536 	else if (ob &&
1537 		 (i=ismemb(event.xexpose.window,ob))) {
1538 	  if (!event.xexpose.count) {
1539 	    draw_di(sn,i<0?0:i);
1540 	  }
1541 	}
1542 	else if (resdial[sn] &&
1543 		 (i=ismemb(event.xexpose.window,resdial[sn]))) {
1544 	  if (!event.xexpose.count) {
1545 	    draw_dial(sn,i<0?0:i,resdial[sn]);
1546 	  }
1547 	}
1548 	break;
1549       }
1550       set_selpos(sn);
1551     }
1552     if (b) {
1553       del_selpos(sn);
1554       hndl_button(b-1,x,y,opt,1);
1555     }
1556     computer();
1557   }
1558   if (actdial[0]==diwarteauf) {
1559     polldisps();
1560   }
1561   if (irc_play) {
1562     while ((l=irc_getline())) {
1563       irc_parse(l);
1564     }
1565     irc_talk((char *)0);
1566   }
1567 }
1568 
getob_xywhbd(sn,ob,i,x,y,w,h,bp)1569 VOID getob_xywhbd(sn,ob,i,x,y,w,h,bp)
1570 int sn;
1571 OBJECT *ob;
1572 int i,*x,*y,*w,*h,*bp;
1573 {
1574   int bd,ba,d3d;
1575 
1576   bd=ob[i].spec&OB_BUTTON?1:ob[i].spec&OB_EXIT?2:0;
1577   ba=gfx3d[sn]?2*bd:0;
1578   d3d=bd && gfx3d[sn]?1:0;
1579   *x=ob[i].x*charw[sn]-bd+d3d;
1580   *y=ob[i].y*charh[sn]-bd+d3d;
1581   *w=ob[i].w*charw[sn]-!!bd-d3d+ba;
1582   *h=ob[i].h*charh[sn]-!!bd-d3d+ba;
1583   *bp=bd;
1584 }
1585 
create_dial(sn,x,y,dy,ob)1586 VOID create_dial(sn,x,y,dy,ob)
1587 int sn;
1588 int x,y,dy;
1589 OBJECT *ob;
1590 {
1591   Window rt,wi;
1592   int i,w,h,bd;
1593 
1594   rt=XCreateSimpleWindow(dpy[sn],win[sn],x-1,y-dy-1,
1595 			 ob[0].w*charw[sn],dy+ob[0].h*charh[sn],
1596 			 1,fgpix[sn],bgpix[sn]);
1597   ob[0].y=dy;
1598   ob[0].win=rt;
1599   XSelectInput(dpy[sn],rt,ExposureMask);
1600   for (i=1;i<ob[0].spec;i++) {
1601     if (ob[i].spec&OB_HIDDEN) {
1602       ob[i].win=None;
1603       continue;
1604     }
1605     ob[i].spec&=~OB_SELECTED;
1606     getob_xywhbd(sn,ob,i,&x,&y,&w,&h,&bd);
1607     wi=XCreateSimpleWindow(dpy[sn],rt,x,y+dy,w,h,gfx3d[sn]?0:bd,
1608 			   ob_disabled(ob,i)?bgpix[sn]:fgpix[sn],
1609 			   bd && !ob_disabled(ob,i)?btpix[sn]:bgpix[sn]);
1610     ob[i].win=wi;
1611     XSelectInput(dpy[sn],wi,ExposureMask|
1612 		 (ob[i].spec&(OB_BUTTON|OB_EXIT)?ButtonPressMask:0));
1613     XMapWindow(dpy[sn],wi);
1614   }
1615   XMapWindow(dpy[sn],rt);
1616 }
1617 
findlastex(sn)1618 VOID findlastex(sn)
1619 int sn;
1620 {
1621   int i;
1622   OBJECT *ob;
1623 
1624   actbtn[sn]=0;
1625   ob=actdial[sn];
1626   for (i=ob[0].spec-1;i;i--) {
1627     if (ob[i].spec&OB_EXIT &&
1628 	!ob_disabled(ob,i)) {
1629       actbtn[sn]=i;
1630       return;
1631     }
1632   }
1633 }
1634 
create_di(sn,ob)1635 VOID create_di(sn,ob)
1636 int sn;
1637 OBJECT *ob;
1638 {
1639   int x,y;
1640 
1641   if (actdial[sn]) remove_di(sn);
1642   x=(desk[sn].w-ob[0].w*charw[sn])/2;
1643   y=(desk[sn].h-ob[0].h*charh[sn])/2;
1644   create_dial(sn,x,y,0,ob);
1645   actdial[sn]=ob;
1646   findlastex(sn);
1647   del_selpos(sn);
1648 }
1649 
create_diopt(sn,ob)1650 VOID create_diopt(sn,ob)
1651 int sn;
1652 OBJECT *ob;
1653 {
1654   int x,y;
1655 
1656   if (actdial[sn]) remove_di(sn);
1657   x=(desk[sn].w-ob[0].w*charw[sn])/2;
1658   y=(desk[sn].h+12*charh[sn])/2-ob[0].h*charh[sn];
1659   create_dial(sn,x,y,0,ob);
1660   actdial[sn]=ob;
1661   findlastex(sn);
1662   del_selpos(sn);
1663 }
1664 
remove_dial(sn,ob)1665 VOID remove_dial(sn,ob)
1666 int sn;
1667 OBJECT *ob;
1668 {
1669   XDestroyWindow(dpy[sn],ob[0].win);
1670 }
1671 
remove_di(sn)1672 VOID remove_di(sn)
1673 int sn;
1674 {
1675   remove_dial(sn,actdial[sn]);
1676   actdial[sn]=0;
1677 }
1678 
draw_3d(w,b,sn,x1,y1,x2,y2,rev)1679 VOID draw_3d(w,b,sn,x1,y1,x2,y2,rev)
1680 Window w;
1681 Pixmap b;
1682 int sn,x1,y1,x2,y2,rev;
1683 {
1684   XPoint pts[3];
1685 
1686   pts[0].x=(short)x1;
1687   pts[0].y=(short)y2;
1688   pts[1].x=(short)x1;
1689   pts[1].y=(short)y1;
1690   pts[2].x=(short)x2;
1691   pts[2].y=(short)y1;
1692   change_gc(sn,rev?b3dpix[sn]:w3dpix[sn],gc);
1693   XDrawLines(dpy[sn],w,gc[sn],pts,3,CoordModeOrigin);
1694   if (b!=None) XDrawLines(dpy[sn],b,gc[sn],pts,3,CoordModeOrigin);
1695   pts[0].x++;
1696   pts[1].x=(short)x2;
1697   pts[1].y=(short)y2;
1698   pts[2].y++;
1699   change_gc(sn,rev?w3dpix[sn]:b3dpix[sn],gc);
1700   XDrawLines(dpy[sn],w,gc[sn],pts,3,CoordModeOrigin);
1701   if (b!=None) XDrawLines(dpy[sn],b,gc[sn],pts,3,CoordModeOrigin);
1702   change_gc(sn,fgpix[sn],gc);
1703 }
1704 
draw_dial(sn,i,ob)1705 VOID draw_dial(sn,i,ob)
1706 int sn,i;
1707 OBJECT *ob;
1708 {
1709   int x,y,w,h,l,bd,sel;
1710   char *str;
1711 
1712   if (!ob) return;
1713   if (!i) {
1714     w=ob[0].w*charw[sn];
1715     h=ob[0].h*charh[sn]+ob[0].y;
1716     XClearWindow(dpy[sn],ob[0].win);
1717     if (gfx3d[sn]) {
1718       draw_3d(ob[0].win,None,sn,0,0,w-1,h-1,0);
1719       draw_3d(ob[0].win,None,sn,1,1,w-2,h-2,0);
1720     }
1721     else {
1722       change_gc(sn,btpix[sn],gc);
1723       XDrawRectangle(dpy[sn],ob[0].win,gc[sn],0,0,w-1,h-1);
1724       XDrawRectangle(dpy[sn],ob[0].win,gc[sn],1,1,w-3,h-3);
1725       change_gc(sn,fgpix[sn],gc);
1726       XDrawRectangle(dpy[sn],ob[0].win,gc[sn],2,2,w-5,h-5);
1727     }
1728   }
1729   else {
1730     if (ob[i].spec&OB_HIDDEN) return;
1731     sel=ob[i].spec&OB_SELECTED;
1732     XClearWindow(dpy[sn],ob[i].win);
1733     if (ob[i].str!=OB_NONE && (l=strlen(str=ob[i].str->t[lang[sn]]))) {
1734       x=y=0;
1735       if (ob[i].spec&(OB_BUTTON|OB_EXIT|OB_CENTERED)) {
1736 	x=(ob[i].w*charw[sn]-XTextWidth(dfont[sn],str,l))/2;
1737 	y=(ob[i].h-1)*charh[sn]/2;
1738       }
1739       else if (ob[i].spec&OB_RIGHT) {
1740 	x=ob[i].w*charw[sn]-XTextWidth(dfont[sn],str,l);
1741       }
1742       if (gfx3d[sn]) {
1743 	if (ob[i].spec&OB_EXIT) x+=2,y+=2;
1744 	else if (ob[i].spec&OB_BUTTON) x++,y++;
1745       }
1746       XDrawString(dpy[sn],ob[i].win,gc[sn],x,
1747 		  y+(charh[sn]+dfont[sn]->ascent-dfont[sn]->descent)/2-
1748 		  gfx3d[sn],str,l);
1749       if (ob[i].spec&OB_BOLD) {
1750 	XDrawString(dpy[sn],ob[i].win,gc[sn],x+1,
1751 		    y+(charh[sn]+dfont[sn]->ascent-dfont[sn]->descent)/2-
1752 		    gfx3d[sn],str,l);
1753       }
1754       if (ob[i].spec&OB_UNDERLINED && l) {
1755 	XDrawLine(dpy[sn],ob[i].win,gc[sn],x,
1756 		  y+(charh[sn]+dfont[sn]->ascent-dfont[sn]->descent)/2-
1757 		  gfx3d[sn]+1,
1758 		  x+XTextWidth(dfont[sn],str,l),
1759 		  y+(charh[sn]+dfont[sn]->ascent-dfont[sn]->descent)/2-
1760 		  gfx3d[sn]+1);
1761       }
1762     }
1763     if (gfx3d[sn]) {
1764       getob_xywhbd(sn,ob,i,&x,&y,&w,&h,&bd);
1765       if (!bd && sel) bd=1;
1766       if (sel || !ob_disabled(ob,i)) {
1767 	if (bd) {
1768 	  draw_3d(ob[i].win,None,sn,0,0,w-1,h-1,sel);
1769 	  if (bd==2) draw_3d(ob[i].win,None,sn,1,1,w-2,h-2,sel);
1770 	}
1771       }
1772     }
1773     else if (sel) {
1774       bd=ob[i].spec&(OB_BUTTON|OB_EXIT) && !ob_disabled(ob,i);
1775       if (bd) change_gcxor(sn,btpix[sn]^fgpix[sn]^bgpix[sn]);
1776       XFillRectangle(dpy[sn],ob[i].win,gcxor[sn],0,0,
1777 		     ob[i].w*charw[sn],ob[i].h*charh[sn]);
1778       if (bd) change_gcxor(sn,fgpix[sn]);
1779     }
1780   }
1781   draw_actbtn(sn,1);
1782 }
1783 
draw_di(sn,idx)1784 VOID draw_di(sn,idx)
1785 int sn,idx;
1786 {
1787   draw_dial(sn,idx,actdial[sn]);
1788 }
1789 
refresh()1790 VOID refresh()
1791 {
1792   int sn,i;
1793   XEvent event;
1794 
1795   for (sn=0;sn<numsp;sn++) {
1796     if (lost[sn]) continue;
1797     if (resdial[sn]) {
1798       for (i=0;i<resdial[sn][0].spec;i++) {
1799 	if (resdial[sn][i].win) {
1800 	  while (XCheckTypedWindowEvent(dpy[sn],resdial[sn][i].win,
1801 					Expose,&event)) {
1802 	    if (!event.xexpose.count) {
1803 	      draw_dial(sn,i,resdial[sn]);
1804 	    }
1805 	  }
1806 	}
1807       }
1808     }
1809     if (actdial[sn]) {
1810       for (i=0;i<actdial[sn][0].spec;i++) {
1811 	if (actdial[sn][i].win) {
1812 	  while (XCheckTypedWindowEvent(dpy[sn],actdial[sn][i].win,
1813 					Expose,&event)) {
1814 	    if (!event.xexpose.count) {
1815 	      draw_dial(sn,i,actdial[sn]);
1816 	    }
1817 	  }
1818 	}
1819       }
1820     }
1821     while (XCheckTypedWindowEvent(dpy[sn],win[sn],Expose,&event)) {
1822       XCopyArea(dpy[sn],bck[sn],win[sn],gc[sn],event.xexpose.x,event.xexpose.y,
1823 		event.xexpose.width,event.xexpose.height,
1824 		event.xexpose.x,event.xexpose.y);
1825     }
1826     XFlush(dpy[sn]);
1827   }
1828 }
1829 
prspnam(txt,sn,ln)1830 VOID prspnam(txt,sn,ln)
1831 char *txt;
1832 int sn,ln;
1833 {
1834   strcpy(txt,spnames[sn][0][ln]);
1835   if (spnames[sn][1][ln][0]) {
1836     strcat(txt," ");
1837     strcat(txt,spnames[sn][1][ln]);
1838   }
1839 }
1840 
di_info(sn,th)1841 VOID di_info(sn,th)
1842 int sn,th;
1843 {
1844   int s,x,y,w;
1845   char txt[20];
1846   char clr[100];
1847 
1848   w=3*desk[sn].cardw/XTextWidth(dfont[sn]," ",1)+1;
1849   if (w>99) w=99;
1850   clr[w]=0;
1851   while (w) clr[--w]=' ';
1852   for (s=0;s<3;s++) {
1853     if (s!=sn) {
1854       prspnam(txt,s,lang[sn]);
1855       x=(s==left(sn)?desk[sn].com1x
1856 	 :desk[sn].com2x)+30*desk[sn].f/desk[sn].q;
1857       y=(s==left(sn)?desk[sn].com1y
1858 	 :desk[sn].com2y)+130*desk[sn].f/desk[sn].q;
1859       v_gtext(sn,x,y,0,clr);
1860       if (th<-1) {
1861 	v_gtext(sn,x,y+charh[sn],0,clr);
1862 	continue;
1863       }
1864       if (numsp==1) {
1865 	if (phase>=SPIELEN && phase<=NIMMSTICH && s==spieler && trumpf!=5) {
1866 	  prspnam(txt,s,lang[sn]);
1867 	}
1868 	else {
1869 	  *txt=0;
1870 	}
1871       }
1872       if (numsp!=1 || !briefmsg[sn]) {
1873 	v_gtext(sn,x,y,0,txt);
1874       }
1875       y+=charh[sn];
1876       if ((phase==SPIELEN || phase==SCHENKEN) &&
1877 	  (numsp!=1 || !briefmsg[sn]) &&
1878 	  (stich==1 || (s!=th && !briefmsg[sn])) && s==spieler && trumpf!=5) {
1879 	v_gtext(sn,x,y,0,clr);
1880 	strcpy(txt,textarr[TX_SPIELT].t[lang[sn]]);
1881 	strcat(txt,textarr[revolang?TX_REVOLUTION:trumpf_idx(sn,trumpf)].
1882 	       t[lang[sn]]);
1883 	v_gtext(sn,x,y,0,txt);
1884 	y+=charh[sn];
1885 	v_gtext(sn,x,y,0,clr);
1886 	if (ouveang && !revolang) {
1887 	  if (handsp && trumpf==-1) {
1888 	    v_gtext(sn,x,y,0,textarr[TX_OUVE_HAND].t[lang[sn]]);
1889 	  }
1890 	  else {
1891 	    v_gtext(sn,x,y,0,textarr[TX_OUVE].t[lang[sn]]);
1892 	  }
1893 	}
1894 	else if (schwang) {
1895 	  v_gtext(sn,x,y,0,textarr[TX_SCHW_ANGE].t[lang[sn]]);
1896 	}
1897 	else if (schnang) {
1898 	  v_gtext(sn,x,y,0,textarr[TX_SCHN_ANGE].t[lang[sn]]);
1899 	}
1900 	else if (handsp && !revolang) {
1901 	  v_gtext(sn,x,y,0,textarr[TX_HAND].t[lang[sn]]);
1902 	}
1903       }
1904       else if (th>=0) {
1905 	v_gtext(sn,x,y,0,clr);
1906 	if (s==th) {
1907 	  v_gtext(sn,x,y,0,textarr[TX_UEBERLEGT].t[lang[sn]]);
1908 	}
1909 	else if (phase>=REIZEN && phase<=ANSAGEN && !briefmsg[sn]) {
1910 	  v_gtext(sn,x,y,0,textarr[ausspl==s?TX_VORHAND:
1911 				   (ausspl+1)%3==s?TX_MITTELHAND:
1912 				   TX_HINTERHAND].t[lang[sn]]);
1913 	}
1914 	v_gtext(sn,x,y+charh[sn],0,clr);
1915       }
1916       else if (phase>ANSAGEN) {
1917 	v_gtext(sn,x,y,0,clr);
1918       }
1919     }
1920   }
1921 }
1922 
di_hand()1923 VOID di_hand()
1924 {
1925   int ln;
1926   static char txt[NUM_LANG][33];
1927   static tx_typ tt;
1928 
1929   dihand[4].str=&tt;
1930   for (ln=0;ln<NUM_LANG;ln++) {
1931     tt.t[ln]=txt[ln];
1932     sprintf(txt[ln],textarr[TX_GEREIZT_BIS_N].t[ln],reizw[reizp]);
1933   }
1934   create_di(spieler,dihand);
1935 }
1936 
next_grandhand(sn)1937 VOID next_grandhand(sn)
1938 int sn;
1939 {
1940   sn=left(sn);
1941   if (sn==hoerer) {
1942     ktrply=-1;
1943     init_ramsch();
1944   }
1945   else {
1946     di_grandhand(sn);
1947   }
1948 }
1949 
di_grandhand(sn)1950 VOID di_grandhand(sn)
1951 int sn;
1952 {
1953   if (iscomp(sn)) {
1954     if (testgrandhand(sn)) do_grandhand(sn);
1955     else next_grandhand(sn);
1956   }
1957   else {
1958     ktrply=sn;
1959     create_di(sn,digrandhand);
1960     actbtn[sn]--;
1961   }
1962 }
1963 
di_term(sn,s)1964 VOID di_term(sn,s)
1965 int sn,s;
1966 {
1967   int ln;
1968   static char txt[3][NUM_LANG][20];
1969   static tx_typ tt[3];
1970 
1971   if (lost[sn]) return;
1972   diterm[sn][2].str=&tt[sn];
1973   for (ln=0;ln<NUM_LANG;ln++) {
1974     tt[sn].t[ln]=txt[sn][ln];
1975     prspnam(txt[sn][ln],s,ln);
1976   }
1977   create_di(sn,diterm[sn]);
1978 }
1979 
di_ende(sn)1980 VOID di_ende(sn)
1981 int sn;
1982 {
1983   create_di(sn,diende[sn]);
1984   actbtn[sn]--;
1985 }
1986 
di_loesch(sn)1987 VOID di_loesch(sn)
1988 int sn;
1989 {
1990   create_di(sn,diloesch);
1991   actbtn[sn]--;
1992 }
1993 
di_ansage()1994 VOID di_ansage()
1995 {
1996   int ln,sn,i,ktr;
1997   static char txt[3][NUM_LANG][30];
1998   static tx_typ tt[3];
1999 
2000   ktrply=-1;
2001   diansage[2].str=&tt[0];
2002   for (sn=0;sn<numsp;sn++) {
2003     dikontra[sn][2].str=dikonre[sn][2].str=&tt[sn];
2004     for (ln=0;ln<NUM_LANG;ln++) {
2005       tt[sn].t[ln]=txt[sn][ln];
2006       strcpy(txt[sn][ln],textarr[revolang?TX_REVOLUTION:trumpf_idx(sn,trumpf)].
2007 	     t[ln]);
2008       if (trumpf==-1) {
2009 	if (!revolang) {
2010 	  if (ouveang) {
2011 	    strcat(txt[sn][ln]," ");
2012 	    strcat(txt[sn][ln],textarr[TX_OUVE].t[ln]);
2013 	  }
2014 	  if (handsp) {
2015 	    strcat(txt[sn][ln]," ");
2016 	    strcat(txt[sn][ln],textarr[TX_HAND].t[ln]);
2017 	  }
2018 	}
2019       }
2020       else {
2021 	if (ouveang) {
2022 	  strcat(txt[sn][ln]," ");
2023 	  strcat(txt[sn][ln],textarr[TX_OUVE].t[ln]);
2024 	}
2025 	else if (schwang) {
2026 	  strcat(txt[sn][ln]," ");
2027 	  strcat(txt[sn][ln],textarr[TX_SCHWARZ].t[ln]);
2028 	}
2029 	else if (schnang) {
2030 	  strcat(txt[sn][ln]," ");
2031 	  strcat(txt[sn][ln],textarr[TX_SCHNEIDER].t[ln]);
2032 	}
2033 	else if (handsp) {
2034 	  strcat(txt[sn][ln]," ");
2035 	  strcat(txt[sn][ln],textarr[TX_HAND].t[ln]);
2036 	}
2037       }
2038     }
2039   }
2040   ktr=0;
2041   ktrnext=-1;
2042   if (playkontra) {
2043     for (i=0;i<3;i++) {
2044       if (i!=spieler && (playkontra==1 || sagte18[i])) {
2045 	if (!ktr) {
2046 	  ktr=1;
2047 	  ktrsag=i;
2048 	  ktrnext=i;
2049 	}
2050 	else if ((sagte18[i] && (i==sager || i==hoerer)) ||
2051 		 !sagte18[ktrsag]) {
2052 	  ktrsag=i;
2053 	}
2054 	else {
2055 	  ktrnext=i;
2056 	}
2057       }
2058     }
2059   }
2060   if (numsp==1 && iscomp(spieler) && briefmsg[0] && !ktr) {
2061     create_di(0,diansage);
2062   }
2063   else if (ktr) {
2064     di_kontra(ktrsag);
2065   }
2066   else do_angesagt();
2067 }
2068 
di_kontra(sn)2069 VOID di_kontra(sn)
2070 int sn;
2071 {
2072   ktrply=sn;
2073   ktrsag=sn;
2074   sort2[sn]=sort2[spieler]=trumpf==-1;
2075   if (!iscomp(spieler)) initscr(spieler,1);
2076   if (iscomp(sn)) {
2077     di_ktrnext(sn,sage_kontra(sn));
2078   }
2079   else {
2080     initscr(sn,1);
2081     create_di(sn,dikontra[sn]);
2082   }
2083 }
2084 
di_rekontra(sn)2085 VOID di_rekontra(sn)
2086 int sn;
2087 {
2088   int ln;
2089   static char txt[NUM_LANG][30];
2090   static tx_typ tt;
2091 
2092   ktrply=-1;
2093   direkontra[2].str=&tt;
2094   for (ln=0;ln<NUM_LANG;ln++) {
2095     tt.t[ln]=txt[ln];
2096     strcpy(txt[ln],textarr[TX_VON].t[ln]);
2097     prspnam(txt[ln]+strlen(txt[ln]),sn,ln);
2098   }
2099   if (iscomp(spieler)) {
2100     di_ktrnext(sn,sage_re(spieler));
2101   }
2102   else {
2103     create_di(spieler,direkontra);
2104   }
2105 }
2106 
di_konre(sn)2107 VOID di_konre(sn)
2108 int sn;
2109 {
2110   int ln;
2111   static char txt[NUM_LANG][30];
2112   static tx_typ tt;
2113 
2114   ktrply=sn;
2115   dikonre[sn][3].str=&tt;
2116   for (ln=0;ln<NUM_LANG;ln++) {
2117     tt.t[ln]=txt[ln];
2118     strcpy(txt[ln],textarr[TX_MIT_KONTRA].t[ln]);
2119     if (kontrastufe==2) {
2120       strcat(txt[ln]," & ");
2121       strcat(txt[ln],textarr[TX_RE].t[ln]);
2122     }
2123   }
2124   create_di(sn,dikonre[sn]);
2125 }
2126 
di_ktrnext(sn,f)2127 VOID di_ktrnext(sn,f)
2128 int sn,f;
2129 {
2130   if (kontrastufe==1) {
2131     if (f) {
2132       kontrastufe=2;
2133       prot2.verdopp[spieler]=2;
2134       ktrnext=left(ktrsag)==spieler?right(ktrsag):left(ktrsag);
2135       if (iscomp(ktrnext)) ktrnext=-1;
2136       if (iscomp(ktrsag)) ktrsag=ktrnext,ktrnext=-1;
2137     }
2138     else {
2139       ktrnext=-1;
2140       ktrsag=left(ktrsag)==spieler?right(ktrsag):left(ktrsag);
2141       if (iscomp(ktrsag)) ktrsag=ktrnext;
2142     }
2143     if (ktrsag>=0) {
2144       di_konre(ktrsag);
2145     }
2146     else {
2147       do_angesagt();
2148     }
2149   }
2150   else if (f) {
2151     kontrastufe=1;
2152     prot2.verdopp[sn]=2;
2153     di_rekontra(sn);
2154   }
2155   else if (ktrnext>=0 && ktrnext!=sn) {
2156     di_kontra(ktrnext);
2157     ktrnext=-1;
2158   }
2159   else {
2160     if (numsp==1 && iscomp(spieler) && briefmsg[0] &&
2161 	playkontra==2 && !sagte18[0]) {
2162       create_di(0,diansage);
2163     }
2164     else do_angesagt();
2165   }
2166 }
2167 
di_dicht()2168 VOID di_dicht()
2169 {
2170   int sn;
2171 
2172   phase=SPIELDICHT;
2173   if (iscomp(spieler)) {
2174     for (sn=0;sn<numsp;sn++) {
2175       if (abkuerz[sn]) {
2176 	spielendscr();
2177 	return;
2178       }
2179     }
2180   }
2181   else {
2182     if (abkuerz[spieler]==1) {
2183       didicht[1].str=&textarr[trumpf==-1?TX_NULL_DICHT:TX_REST_BEI_MIR];
2184       if (irc_play) {
2185 	didicht[0].h=7;
2186 	didicht[5].spec=didicht[6].spec=OB_HIDDEN;
2187       }
2188       create_di(spieler,didicht);
2189       actbtn[spieler]-=irc_play?1:3;
2190       return;
2191     }
2192     else if (abkuerz[spieler]==2) {
2193       spielendscr();
2194       return;
2195     }
2196   }
2197   ndichtw=1;
2198   phase=SPIELEN;
2199 }
2200 
di_weiter(ini)2201 VOID di_weiter(ini)
2202 int ini;
2203 {
2204   int x,y,sn;
2205   static int num;
2206 
2207   skatopen=0;
2208   if (!numsp || !ini) {
2209     if (!numsp || !--num) {
2210       if (reizp>=0) finishgame();
2211       else {
2212 	clr_desk(0);
2213 	phase=GEBEN;
2214       }
2215     }
2216     return;
2217   }
2218   num=numsp;
2219   for (sn=0;sn<numsp;sn++) {
2220     x=(desk[sn].w-diweiter[sn][0].w*charw[sn])/2;
2221     y=(desk[sn].playy+desk[sn].skaty+desk[sn].cardh+
2222        -diweiter[sn][0].h*charh[sn])/2;
2223     if (actdial[sn]) remove_di(sn);
2224     create_dial(sn,x,y,0,diweiter[sn]);
2225     actdial[sn]=diweiter[sn];
2226     findlastex(sn);
2227     del_selpos(sn);
2228   }
2229 }
2230 
di_wiederweiter(sn)2231 VOID di_wiederweiter(sn)
2232 int sn;
2233 {
2234   int x,y;
2235 
2236   x=(desk[sn].w-diwiederweiter[0].w*charw[sn])/2;
2237   y=(desk[sn].playy+desk[sn].skaty+desk[sn].cardh+
2238      -diwiederweiter[0].h*charh[sn])/2;
2239   if (actdial[sn]) remove_di(sn);
2240   create_dial(sn,x,y,0,diwiederweiter);
2241   actdial[sn]=diwiederweiter;
2242   findlastex(sn);
2243   del_selpos(sn);
2244 }
2245 
di_klopfen(sn)2246 VOID di_klopfen(sn)
2247 int sn;
2248 {
2249   create_di(sn,diklopfen);
2250   actbtn[sn]--;
2251 }
2252 
di_schenken(sn)2253 VOID di_schenken(sn)
2254 int sn;
2255 {
2256   int msp;
2257 
2258   if (schenkstufe) return;
2259   phase=SCHENKEN;
2260   schenkstufe=1;
2261   schenknext=sn;
2262   msp=left(sn)==spieler?left(spieler):left(sn);
2263   if (iscomp(msp)) {
2264     if (kontrastufe) di_nichtschenken(msp);
2265     else di_geschenkt();
2266   }
2267   else {
2268     create_di(msp,dischenken);
2269     actbtn[msp]--;
2270     schenkply=msp;
2271   }
2272 }
2273 
di_geschenkt()2274 VOID di_geschenkt()
2275 {
2276   if (iscomp(spieler)) {
2277     finishgame();
2278   }
2279   else {
2280     digeschenkt[4].str=&textarr[schnang?TX_SCHWARZ:TX_SCHNEIDER];
2281     create_di(spieler,schwang || trumpf==-1?diendeschenken:digeschenkt);
2282     if (!schwang && trumpf!=-1) actbtn[spieler]--;
2283     schenkply=spieler;
2284   }
2285 }
2286 
di_wiederschenken(sn,f)2287 VOID di_wiederschenken(sn,f)
2288 int sn,f;
2289 {
2290   int msp;
2291 
2292   msp=left(sn)==spieler?left(spieler):left(sn);
2293   schenknext=f && !iscomp(msp)?msp:-1;
2294   create_di(sn,diwiederschenken);
2295   actbtn[sn]--;
2296   schenkply=sn;
2297 }
2298 
di_nichtschenken(sn)2299 VOID di_nichtschenken(sn)
2300 int sn;
2301 {
2302   sn=left(sn)==spieler?left(spieler):left(sn);
2303   if (!iscomp(sn)) {
2304     create_di(sn,dinichtschenken);
2305     schenkply=sn;
2306   }
2307   else {
2308     phase=SPIELEN;
2309   }
2310 }
2311 
di_schieben()2312 VOID di_schieben()
2313 {
2314   int sn;
2315 
2316   do {
2317     if (vmh) save_skat(vmh+1);
2318     sn=(ausspl+vmh)%3;
2319     spieler=sn;
2320     if (iscomp(sn)) {
2321       if (comp_sramsch(sn)) {
2322 	return;
2323       }
2324       vmh=left(vmh);
2325     }
2326     else {
2327       create_di(sn,playsramsch?dischieben:diklopfen);
2328       actbtn[sn]--;
2329       return;
2330     }
2331   } while (vmh);
2332   start_ramsch();
2333 }
2334 
di_verdoppelt(f,kl)2335 int di_verdoppelt(f,kl)
2336 int f,kl;
2337 {
2338   int ln,sn;
2339   static int verd1,verd2;
2340   static char txt[NUM_LANG][20];
2341   static tx_typ tt;
2342 
2343   if (!f) {
2344     diverdoppelt[3].str=&textarr[kl?TX_KLOPFT:TX_SCHIEBT];
2345     for (ln=0;ln<NUM_LANG;ln++) {
2346       tt.t[ln]=txt[ln];
2347       prspnam(txt[ln],spieler,ln);
2348     }
2349     diverdoppelt[2].str=&tt;
2350     verd1=verd2=-1;
2351     for (sn=0;sn<numsp;sn++) {
2352       if (sn!=spieler) {
2353 	if (verd1==-1) verd1=sn;
2354 	else verd2=sn;
2355       }
2356     }
2357     sramschstufe++;
2358     prot2.verdopp[spieler]=kl+1;
2359   }
2360   if (verd1!=-1) {
2361     spieler=verd1;
2362     create_di(spieler,diverdoppelt);
2363     verd1=verd2;
2364     verd2=-1;
2365     return 1;
2366   }
2367   if (!iscomp(spieler)) {
2368     vmh=left(vmh);
2369     if (vmh) di_schieben();
2370     else start_ramsch();
2371   }
2372   return 0;
2373 }
2374 
di_buben()2375 VOID di_buben()
2376 {
2377   dibuben[2].str=&textarr[blatt[spieler]>=2?TX_UNTER_NICHT:TX_BUBEN_NICHT];
2378   create_di(spieler,dibuben);
2379 }
2380 
di_spiel()2381 VOID di_spiel()
2382 {
2383   int ln,i,j,a[4];
2384   static char txt[NUM_LANG][33];
2385   static tx_typ tt,tzur;
2386 
2387   ktrply=-1;
2388   dispiel[14].str=&tzur;
2389   dispiel[15].str=&tt;
2390   for (ln=0;ln<NUM_LANG;ln++) {
2391     tzur.t[ln]="<-";
2392     tt.t[ln]=txt[ln];
2393     sprintf(txt[ln],textarr[TX_GEREIZT_BIS_N].t[ln],reizw[reizp]);
2394   }
2395   dispiel[11].spec=spitzezaehlt && kannspitze?OB_BUTTON:OB_HIDDEN;
2396   dispiel[13].spec=revolution?OB_BUTTON:OB_HIDDEN;
2397   dispiel[7].next=revolution?6:-5;
2398   for (i=0;i<4;i++) {
2399     dispiel[2+i].str=&textarr[(blatt[spieler]>=2?TX_SCHELLEN:TX_KARO)+i];
2400   }
2401   create_di(spieler,dispiel);
2402   a[0]=a[1]=a[2]=a[3]=0;
2403   for (i=0;i<10;i++) {
2404     if ((cards[10*spieler+i]&7)!=BUBE) a[cards[10*spieler+i]>>3]++;
2405   }
2406   j=3;
2407   for (i=2;i>=0;i--) {
2408     if (a[i]>a[j]) j=i;
2409   }
2410   dispiel[j+2].spec|=OB_SELECTED;
2411   actbtn[spieler]=12;
2412 }
2413 
list_fun(sn)2414 VOID list_fun(sn)
2415 int sn;
2416 {
2417   int i,j,k,s,e,r,d,curr[3][3],cgv[3][2],cp,ln;
2418   static char txt[3][13][4][10];
2419   static tx_typ tt[3][13][4];
2420 
2421   for (i=0;i<3;i++) {
2422     for (j=0;j<3;j++) {
2423       curr[i][j]=splsum[i][j];
2424     }
2425     for (j=0;j<2;j++) {
2426       cgv[i][j]=sgewoverl[i][j];
2427     }
2428     for (j=0;j<13;j++) {
2429       for (k=0;k<4;k++) {
2430 	for (ln=0;ln<NUM_LANG;ln++) {
2431 	  tt[i][j][k].t[ln]=txt[i][j][k];
2432 	}
2433       }
2434     }
2435   }
2436   cp=alist[sn];
2437   for (j=0;j<splfirst[sn];j++) {
2438     modsum(curr,cgv,j,(int *)0,(int *)0,(int *)0,(int *)0);
2439   }
2440   for (k=0;k<3;k++) {
2441     diliste[sn][8+k].str=&tt[sn][0][k];
2442     sprintf(txt[sn][0][k],"%d",curr[k][cp]);
2443   }
2444   for (i=splfirst[sn],j=1;j<13 && i<splstp;i++,j++) {
2445     modsum(curr,cgv,i,&s,&e,&r,&d);
2446     for (k=0;k<4;k++) {
2447       diliste[sn][7+4*j+k].str=&tt[sn][j][k];
2448       sprintf(txt[sn][j][k],"%d",k==3?e>0 && r && !d?-e:e:curr[k][cp]);
2449     }
2450     if ((cp==1 || (r && !d)) && e>0) {
2451       diliste[sn][7+4*j+s].str=OB_NONE;
2452     }
2453     else if (cp!=2 || r || e>=0) {
2454       if (e==0) s=4;
2455       for (k=0;k<3;k++) {
2456 	if (k!=s) diliste[sn][7+4*j+k].str=OB_NONE;
2457       }
2458     }
2459   }
2460   for (;j<13;j++) {
2461     for (k=0;k<4;k++) {
2462       diliste[sn][7+4*j+k].str=OB_NONE;
2463     }
2464   }
2465   for (k=0;k<3;k++) {
2466     sprintf(diliste[sn][59+k].str->t[0],"%d/%d",cgv[k][0],cgv[k][1]);
2467   }
2468 }
2469 
di_delliste()2470 VOID di_delliste()
2471 {
2472   if (irc_play) di_liste(irc_pos,1);
2473   else if (numsp>1) di_liste(0,1);
2474 }
2475 
di_liste(sn,ini)2476 VOID di_liste(sn,ini)
2477 int sn,ini;
2478 {
2479   int ln;
2480   static char txt[3][10];
2481   static char spt[3][3][40];
2482   static tx_typ tt1[3],tt2,tt3,tt4[3];
2483 
2484   for (ln=0;ln<NUM_LANG;ln++) {
2485     tt1[sn].t[ln]=txt[sn];
2486     tt2.t[ln]="<-";
2487     tt3.t[ln]="->";
2488     tt4[0].t[ln]=spt[sn][0];
2489     tt4[1].t[ln]=spt[sn][1];
2490     tt4[2].t[ln]=spt[sn][2];
2491   }
2492   sprintf(txt[sn],"<%d>",alist[sn]+1);
2493   set_names(diliste[sn],2);
2494   if (ini) splfirst[sn]=((splstp>0?splstp-1:0)/12)*12;
2495   diliste[sn][59].str=&tt4[0];
2496   diliste[sn][60].str=&tt4[1];
2497   diliste[sn][61].str=&tt4[2];
2498   diliste[sn][62].str=&tt2;
2499   diliste[sn][62].spec=splfirst[sn]>=12?OB_EXIT:OB_HIDDEN;
2500   diliste[sn][63].str=&tt1[sn];
2501   diliste[sn][63].spec=irc_play?OB_DISABLED|OB_EXIT:OB_EXIT;
2502   diliste[sn][65].str=splfirst[sn]+12>=splstp?&textarr[TX_LOESCHEN]:&tt3;
2503   diliste[sn][65].spec=splfirst[sn]+12<splstp ||
2504     ((splstp || (irc_play &&
2505 		 (sum[0][0] || sum[0][1] || sum[0][2] ||
2506 		  sum[1][0] || sum[1][1] || sum[1][2] ||
2507 		  sum[2][0] || sum[2][1] || sum[2][2]))) &&
2508      ((!irc_play && !sn) || (irc_play &&
2509 			     (phase==GEBEN || phase==REIZEN ||
2510 			      (phase==SPIELEN && sn==(ausspl+vmh)%3)))) &&
2511      ini)?OB_EXIT:OB_HIDDEN;
2512   list_fun(sn);
2513   create_di(sn,diliste[sn]);
2514   actbtn[sn]=64;
2515 }
2516 
ger_toupper(c)2517 int ger_toupper(c)
2518 int c;
2519 {
2520   switch (c) {
2521   case '�':return '�';
2522   case '�':return '�';
2523   case '�':return '�';
2524   default:return toupper(c);
2525   }
2526 }
2527 
pformat(f,spec,txt,fil)2528 VOID pformat(f,spec,txt,fil)
2529 FILE *f;
2530 int spec;
2531 char *txt;
2532 int fil;
2533 {
2534   int i,l;
2535 
2536   i=12;
2537   if (spec&OB_CENTERED) {
2538     l=(12-strlen(txt))/2;
2539     i-=l;
2540     while (l-->0) fputc(' ',f);
2541   }
2542   while (*txt) {
2543     if (unformatted) {
2544       if (spec&OB_BOLD) fprintf(f,"%c",ger_toupper(*txt));
2545       else if (spec&OB_UNDERLINED && *txt==' ') fputc('_',f);
2546       else fputc(*txt,f);
2547     }
2548     else {
2549       if (spec&OB_BOLD) fprintf(f,"%c\b%c",*txt,*txt);
2550       else if (spec&OB_UNDERLINED) fprintf(f,"_\b%c",*txt);
2551       else fputc(*txt,f);
2552     }
2553     txt++;
2554     i--;
2555   }
2556   if (fil) while (i-->0) fputc(' ',f);
2557 }
2558 
prot_fun(sn,f)2559 VOID prot_fun(sn,f)
2560 int sn;
2561 FILE *f;
2562 {
2563   int ln,tr,e,i,j,s,stiche[10][3];
2564   static char txt[3][10][3][NUM_LANG][20];
2565   static tx_typ tt[3][10][3];
2566 
2567   tr=trumpf;
2568   trumpf=prot1.trumpf;
2569   for (s=0;s<3;s++) {
2570     for (i=0;i<10;i++) stiche[i][s]=prot1.stiche[i][s];
2571     for (i=(protsort[sn]?0:prot1.stichgem);i<9;i++) {
2572       for (j=i+1;j<10;j++) {
2573 	if (lower(stiche[i][s],stiche[j][s],trumpf==-1)) {
2574 	  swap(&stiche[i][s],&stiche[j][s]);
2575         }
2576       }
2577     }
2578   }
2579   trumpf=tr;
2580   for (i=0;i<10;i++) {
2581     for (s=0;s<3;s++) {
2582       if (protsort[sn]) {
2583         e=prot1.trumpf!=-1 &&
2584 	  (stiche[i][s]>>3==prot1.trumpf || (stiche[i][s]&7)==BUBE)
2585 	    ?OB_BOLD:OB_NONE;
2586       }
2587       else {
2588 	if (i && prot1.stichgem<=i) {
2589 	  e=prot1.gewonn && prot1.stichgem?OB_NONE:OB_HIDDEN;
2590 	}
2591 	else {
2592 	  e=prot1.anspiel[i]==s?OB_UNDERLINED:OB_NONE;
2593 	  if (prot1.gemacht[i]==s) e|=OB_BOLD;
2594 	}
2595       }
2596       diproto[sn][8+3*i+s].spec=e;
2597       diproto[sn][8+3*i+s].str=&tt[sn][i][s];
2598       for (ln=0;ln<NUM_LANG;ln++) {
2599 	tt[sn][i][s].t[ln]=txt[sn][i][s][ln];
2600 	if (prot1.stichgem || protsort[sn]) {
2601 	  if (prot1.spitze &&
2602 	      stiche[i][s]==(prot1.trumpf==4?BUBE:SIEBEN|prot1.trumpf<<3)) {
2603 	    strcpy(txt[sn][i][s][ln],textarr[TX_SPITZE_PROT].t[ln]);
2604 	  }
2605 	  else {
2606 	    strcpy(txt[sn][i][s][ln],
2607 		   textarr[(blatt[sn]>=2?TX_SCHELLEN:TX_KARO)+
2608 			   (stiche[i][s]>>3)].t[ln]);
2609 	    strcat(txt[sn][i][s][ln],
2610 		   textarr[(blatt[sn]>=2?TX_AD:TX_A)+
2611 			   (stiche[i][s]&7)].t[ln]);
2612 	  }
2613 	}
2614 	else {
2615 	  if (e==OB_UNDERLINED) strcpy(txt[sn][i][s][ln]," ");
2616 	  else txt[sn][i][s][ln][0]=0;
2617 	  strcat(txt[sn][i][s][ln],
2618 		 textarr[prot1.schenken?
2619 			 prot1.spieler==s?TX_AKZEPTIERT:TX_SCHENKEN:TX_PASSE].
2620 		 t[ln]);
2621 	  if (e==OB_UNDERLINED) strcat(txt[sn][i][s][ln]," ");
2622 	}
2623       }
2624     }
2625     if (f && diproto[sn][8+3*i].spec!=OB_HIDDEN) {
2626       fprintf(f,"  ");
2627       for (s=0;s<3;s++) {
2628 	pformat(f,diproto[sn][8+3*i+s].spec,txt[sn][i][s][lang[sn]],1);
2629       }
2630       fprintf(f,"\n");
2631     }
2632   }
2633 }
2634 
im_skat(sn,ln,s,i)2635 VOID im_skat(sn,ln,s,i)
2636 int sn,ln;
2637 char *s;
2638 int i;
2639 {
2640   strcpy(s,textarr[(blatt[sn]>=2?TX_SCHELLEN:TX_KARO)+(prot1.skat[i][0]>>3)].
2641 	 t[ln]);
2642   strcat(s,textarr[(blatt[sn]>=2?TX_AD:TX_A)+(prot1.skat[i][0]&7)].t[ln]);
2643   strcat(s,",");
2644   strcat(s,textarr[(blatt[sn]>=2?TX_SCHELLEN:TX_KARO)+(prot1.skat[i][1]>>3)].
2645 	 t[ln]);
2646   strcat(s,textarr[(blatt[sn]>=2?TX_AD:TX_A)+(prot1.skat[i][1]&7)].t[ln]);
2647 }
2648 
di_proto(sn,ini,log)2649 VOID di_proto(sn,ini,log)
2650 int sn,ini,log;
2651 {
2652   static char txt[3][NUM_LANG][40],aug[3][NUM_LANG][20];
2653   static char imski[3][NUM_LANG][40],imskw[3][NUM_LANG][40];
2654   static char vhschob[3][NUM_LANG][40],mhschob[3][NUM_LANG][40];
2655   static char bis[3][10];
2656   static tx_typ ttxt[3],taug[3];
2657   static tx_typ timski[3],timskw[3];
2658   static tx_typ tvhschob[3],tmhschob[3];
2659   static tx_typ tbis[3],tzur,tvor;
2660   char *hd="----------------------------------------\n";
2661   char *tl="========================================\n";
2662   char hdbuf[100],spn[12];
2663   int ln,s,p,u1,u2,u3;
2664   FILE *f;
2665 
2666   if (!prot_file) log=0;
2667   if (log) {
2668     f=strcmp(prot_file,"-")?fopen(prot_file,"a"):stdout;
2669     if (!f) {
2670       fprintf(stderr,"Can't write file %s\n",prot_file);
2671       return;
2672     }
2673     for (s=0;s<3;s++) {
2674       if (prot1.verdopp[s]==2) {
2675 	strcpy(spn," ");
2676 	strcat(spn,spnames[s][0][lang[0]]);
2677 	strcat(spn," ");
2678 	p=OB_CENTERED|OB_UNDERLINED;
2679       }
2680       else {
2681 	strcpy(spn,spnames[s][0][lang[0]]);
2682 	p=OB_CENTERED;
2683       }
2684       pformat(f,p,spn,1);
2685     }
2686     fputc('\n',f);
2687     for (s=0;s<3;s++) {
2688       if (prot1.verdopp[s]==2 && spnames[s][1][0]) {
2689 	strcpy(spn," ");
2690 	strcat(spn,spnames[s][1][lang[0]]);
2691 	strcat(spn," ");
2692 	p=OB_CENTERED|OB_UNDERLINED;
2693       }
2694       else {
2695 	strcpy(spn,spnames[s][1][lang[0]]);
2696 	p=OB_CENTERED;
2697       }
2698       pformat(f,p,spn,1);
2699     }
2700     fprintf(f,"\n%s",hd);
2701   }
2702   else f=0;
2703   if (ini) protsort[sn]=0;
2704   set_names(diproto[sn],2);
2705   for (p=0;p<2;p++) {
2706     for (s=0;s<3;s++) {
2707       diproto[sn][2+p*3+s].spec=prot1.verdopp[s]==2?
2708 	OB_CENTERED|OB_UNDERLINED:OB_CENTERED;
2709     }
2710   }
2711   diproto[sn][44].str=&ttxt[sn];
2712   for (ln=0;ln<NUM_LANG;ln++) {
2713     ttxt[sn].t[ln]=txt[sn][ln];
2714     if (prot1.trumpf==5 && prot1.augen==0 && !prot1.gewonn) {
2715       strcpy(txt[sn][ln],textarr[TX_NIEMAND].t[ln]);
2716     }
2717     else {
2718       prspnam(txt[sn][ln],prot1.spieler,ln);
2719     }
2720     if (prot1.trumpf==5) {
2721       strcat(txt[sn][ln],textarr[prot1.gewonn?TX_GEWANN:TX_VERLOR].t[ln]);
2722       strcat(txt[sn][ln],textarr[TX_DEN_RAMSCH].t[ln]);
2723     }
2724     else {
2725       strcat(txt[sn][ln],textarr[TX_SPIELTE].t[ln]);
2726       strcat(txt[sn][ln],textarr[prot1.revolution?TX_REVOLUTION:
2727 				 trumpf_idx(sn,prot1.trumpf)].t[ln]);
2728     }
2729   }
2730   diproto[sn][38].str=&textarr[TX_IM_SKAT_IST];
2731   diproto[sn][38].spec=OB_NONE;
2732   diproto[sn][39].str=&timski[sn];
2733   diproto[sn][39].spec=OB_NONE;
2734   diproto[sn][40].str=&textarr[TX_IM_SKAT_WAR];
2735   diproto[sn][40].spec=OB_NONE;
2736   diproto[sn][41].str=&timskw[sn];
2737   diproto[sn][41].spec=OB_NONE;
2738   diproto[sn][42].str=&textarr[TX_GEREIZT_BIS];
2739   diproto[sn][42].spec=OB_NONE;
2740   diproto[sn][43].str=&tbis[sn];
2741   diproto[sn][43].spec=OB_NONE;
2742   for (ln=0;ln<NUM_LANG;ln++) {
2743     tzur.t[ln]="<-";
2744     tvor.t[ln]="->";
2745     timskw[sn].t[ln]=imskw[sn][ln];
2746     timski[sn].t[ln]=imski[sn][ln];
2747     tvhschob[sn].t[ln]=vhschob[sn][ln];
2748     tmhschob[sn].t[ln]=mhschob[sn][ln];
2749     tbis[sn].t[ln]=bis[sn];
2750     taug[sn].t[ln]=aug[sn][ln];
2751     sprintf(aug[sn][ln],textarr[TX_N_AUGEN].t[ln],prot1.augen);
2752     im_skat(sn,ln,imskw[sn][ln],0);
2753     im_skat(sn,ln,imski[sn][ln],1);
2754     im_skat(sn,ln,vhschob[sn][ln],2);
2755     im_skat(sn,ln,mhschob[sn][ln],3);
2756   }
2757   sprintf(bis[sn],"%d",prot1.gereizt);
2758   u1=u2=u3=OB_NONE;
2759   if (prot1.sramsch) {
2760     p=protsort[sn];
2761     if (prot1.verdopp[prot1.anspiel[0]]==1) u1=OB_UNDERLINED;
2762     if (prot1.verdopp[left(prot1.anspiel[0])]==1) u2=OB_UNDERLINED;
2763     if (prot1.verdopp[right(prot1.anspiel[0])]==1) u3=OB_UNDERLINED;
2764   }
2765   else {
2766     p=protsort[sn] && !prot1.handsp?0:prot1.ehsso;
2767   }
2768   if (p) {
2769     if (prot1.sramsch) {
2770       diproto[sn][38].str=&textarr[TX_VH_SCHOB];
2771       diproto[sn][38].spec=u1;
2772       diproto[sn][39].str=&tvhschob[sn];
2773       diproto[sn][40].str=&textarr[TX_MH_SCHOB];
2774       diproto[sn][40].spec=u2;
2775       diproto[sn][41].str=&tmhschob[sn];
2776       diproto[sn][42].str=&textarr[TX_HH_SCHOB];
2777       diproto[sn][42].spec=u3;
2778       diproto[sn][43].str=&timski[sn];
2779     }
2780     else if (prot1.trumpf==5) {
2781       diproto[sn][40].spec=OB_HIDDEN;
2782       diproto[sn][41].spec=OB_HIDDEN;
2783       diproto[sn][42].spec=OB_HIDDEN;
2784       diproto[sn][43].spec=OB_HIDDEN;
2785     }
2786     else {
2787       diproto[sn][40].str=&textarr[TX_HAND_GESP+p-1];
2788       diproto[sn][41].spec=OB_HIDDEN;
2789       if (!prot1.gereizt) {
2790 	diproto[sn][42].spec=OB_HIDDEN;
2791 	diproto[sn][43].spec=OB_HIDDEN;
2792       }
2793     }
2794   }
2795   else {
2796     if (prot1.trumpf==5) {
2797       if (!prot1.sramsch) {
2798 	diproto[sn][40].spec=OB_HIDDEN;
2799 	diproto[sn][41].spec=OB_HIDDEN;
2800       }
2801       diproto[sn][42].spec=OB_HIDDEN;
2802       diproto[sn][43].spec=OB_HIDDEN;
2803     }
2804     else if (!prot1.gereizt) {
2805       diproto[sn][42].spec=OB_HIDDEN;
2806       diproto[sn][43].spec=OB_HIDDEN;
2807     }
2808   }
2809   if (!prot1.stichgem) {
2810     if (prot1.schenken) {
2811       diproto[sn][45].str=&textarr[TX_GEWONNEN];
2812       diproto[sn][46].str=OB_NONE;
2813     }
2814     else {
2815       diproto[sn][42].spec=OB_HIDDEN;
2816       diproto[sn][40].str=OB_NONE;
2817       diproto[sn][41].str=OB_NONE;
2818       diproto[sn][43].str=OB_NONE;
2819       diproto[sn][44].str=OB_NONE;
2820       diproto[sn][45].str=OB_NONE;
2821       diproto[sn][46].str=OB_NONE;
2822     }
2823   }
2824   else if (prot1.trumpf==-1) {
2825     diproto[sn][45].str=&textarr[prot1.gewonn?TX_GEWONNEN:TX_VERLOREN];
2826     diproto[sn][46].str=OB_NONE;
2827   }
2828   else if (prot1.trumpf==5 && prot1.augen==0 && !prot1.gewonn) {
2829     diproto[sn][45].str=diproto[sn][46].str=OB_NONE;
2830   }
2831   else {
2832     diproto[sn][45].str=&textarr[prot1.gewonn?TX_GEWO_MIT:TX_VERL_MIT];
2833     diproto[sn][46].str=&taug[sn];
2834   }
2835   diproto[sn][49].str=protsort[sn]?&tzur:&tvor;
2836   prot_fun(sn,f);
2837   if (log) {
2838     strcpy(hdbuf,hd);
2839     if (prot1.predef!=1) {
2840       sprintf(hdbuf+4+irc_play," random_seed %ld %ld %d%s",
2841 	      prot1.savseed+11*irc_play,prot1.gamenr,
2842 	      right(prot1.anspiel[0])+1,
2843 	      prot1.rotateby<0?" L":prot1.rotateby>0?" R":"");
2844       hdbuf[strlen(hdbuf)]=' ';
2845     }
2846     fputs(hdbuf,f);
2847     protsort[sn]=1;
2848     prot_fun(sn,f);
2849     fputs(hd,f);
2850     fprintf(f,"%s %s\n",textarr[TX_IM_SKAT_IST].t[lang[sn]],
2851 	    imski[sn][lang[sn]]);
2852     if (prot1.stichgem || prot1.schenken) {
2853       if (prot1.trumpf!=5) {
2854 	fprintf(f,"%s %s\n",textarr[TX_IM_SKAT_WAR].t[lang[sn]],
2855 		imskw[sn][lang[sn]]);
2856 	if (prot1.gereizt) {
2857 	  fprintf(f,"%s %s\n",textarr[TX_GEREIZT_BIS].t[lang[sn]],
2858 		  bis[sn]);
2859 	}
2860       }
2861       else if (prot1.sramsch) {
2862 	fprintf(f,"%s %s\n",textarr[TX_IM_SKAT_WAR].t[lang[sn]],
2863 		imskw[sn][lang[sn]]);
2864 	pformat(f,u1,textarr[TX_VH_SCHOB].t[lang[sn]],0);
2865 	fprintf(f," %s\n",vhschob[sn][lang[sn]]);
2866 	pformat(f,u2,textarr[TX_MH_SCHOB].t[lang[sn]],0);
2867 	fprintf(f," %s\n",mhschob[sn][lang[sn]]);
2868 	pformat(f,u3,textarr[TX_HH_SCHOB].t[lang[sn]],0);
2869 	fprintf(f," %s\n",imski[sn][lang[sn]]);
2870       }
2871       fprintf(f,"%s\n",txt[sn][lang[sn]]);
2872       if (diproto[sn][40].str!=&textarr[TX_IM_SKAT_WAR] && prot1.trumpf!=5) {
2873 	fprintf(f,"%s\n",diproto[sn][40].str->t[lang[sn]]);
2874       }
2875       if (prot1.trumpf!=5 || prot1.augen!=0 || prot1.gewonn) {
2876 	fprintf(f,"%s",diproto[sn][45].str->t[lang[sn]]);
2877 	if (diproto[sn][46].str!=OB_NONE) {
2878 	  fprintf(f," %s",diproto[sn][46].str->t[lang[sn]]);
2879 	}
2880 	fputc('\n',f);
2881       }
2882     }
2883     fputs(tl,f);
2884     if (f!=stdout) fclose(f);
2885   }
2886   else {
2887     diproto[sn][47].str=
2888       &textarr[(!sn || irc_play) && protsort[sn]?TX_SPEICHERN:TX_SPIELLISTE];
2889     create_di(sn,diproto[sn]);
2890     actbtn[sn]=48;
2891   }
2892 }
2893 
di_resultdi(sn)2894 VOID di_resultdi(sn)
2895 int sn;
2896 {
2897   create_di(sn,diresult);
2898   diresult[12].spec|=spieler==0?OB_SELECTED:OB_NONE;
2899   diresult[13].spec|=spieler==1?OB_SELECTED:OB_NONE;
2900   diresult[14].spec|=spieler==2?OB_SELECTED:OB_NONE;
2901   if (spgew &&
2902       (alist[sn]==1 || (trumpf==5 && stsum!=120))) {
2903     diresult[12].spec^=OB_SELECTED;
2904     diresult[13].spec^=OB_SELECTED;
2905     diresult[14].spec^=OB_SELECTED;
2906   }
2907   if (trumpf==5 && spwert==0) {
2908     diresult[12].spec=diresult[13].spec=diresult[14].spec&=~OB_SELECTED;
2909   }
2910 }
2911 
di_result(be)2912 VOID di_result(be)
2913 int be;
2914 {
2915   int ln,sn,i,x,y,sx,sy;
2916   static int ini,smlh;
2917   static char sa[NUM_LANG][30],sw[NUM_LANG][40],sg[NUM_LANG][40];
2918   static char su[3][3][10],txt[NUM_LANG][30],spt[3][40];
2919   static tx_typ tsa,tsw,tsg,tsu[3][3],ttxt,tsp[3];
2920 
2921   sx=sy=0;
2922   for (sn=0;sn<numsp;sn++) {
2923     if (handsp || sn!=spieler || trumpf==5) {
2924       i=trumpf==5 && sn==ausspl;
2925       x=desk[sn].playx+8*desk[sn].cardx;
2926       sx=x-charw[sn];
2927       if (sn==spieler || numsp>1 || trumpf==5) {
2928 	y=desk[sn].playy;
2929 	sy=y+desk[sn].cardh-charh[sn];
2930       }
2931       else {
2932 	y=desk[sn].y+3;
2933 	sy=y;
2934 	if (spieler==left(sn)) {
2935 	  x=desk[sn].playx;
2936 	  sx=x+2*desk[sn].cardw+charw[sn];
2937 	}
2938       }
2939       putcard(sn,prot2.skat[i][0],x,y);
2940       putcard(sn,prot2.skat[i][1],x+desk[sn].cardx,y);
2941     }
2942   }
2943   diresult[2].str=
2944     (trumpf==5?
2945      (mes1?&textarr[TX_JUNGFRAU]:
2946       mes2?&textarr[TX_DURCHMARSCH]:
2947       OB_NONE)
2948      :
2949      (mes1?&textarr[TX_UEBERREIZT]:
2950       mes2?&textarr[TX_SCHNEIDERFREI]:
2951       mes3?&textarr[TX_NICHT_SCHWARZ]:
2952       mes4?&textarr[TX_SPITZE_VERLOREN]:
2953       OB_NONE));
2954   diresult[3].str=&tsg;
2955   diresult[4].str=&tsa;
2956   diresult[5].str=&tsw;
2957   diresult[16].str=&tsp[0];
2958   diresult[17].str=&tsp[1];
2959   diresult[18].str=&tsp[2];
2960   diresult[19].str=be?&ttxt:OB_NONE;
2961   for (ln=0;ln<NUM_LANG;ln++) {
2962     tsg.t[ln]=sg[ln];
2963     tsa.t[ln]=sa[ln];
2964     tsw.t[ln]=sw[ln];
2965     ttxt.t[ln]=txt[ln];
2966     tsp[0].t[ln]=spt[0];
2967     tsp[1].t[ln]=spt[1];
2968     tsp[2].t[ln]=spt[2];
2969     if (trumpf==5 && spwert==0) {
2970       strcpy(sg[ln],textarr[TX_NIEMAND].t[ln]);
2971     }
2972     else {
2973       prspnam(sg[ln],spieler,ln);
2974     }
2975     strcat(sg[ln]," ");
2976     strcat(sg[ln],textarr[spgew?TX_GEWINNT:TX_VERLIERT].t[ln]);
2977     if (trumpf==-1) {
2978       strcpy(sa[ln],textarr[TX_DAS_NULLSPIEL].t[ln]);
2979     }
2980     else if (trumpf==5) {
2981       strcpy(sa[ln],textarr[TX_DEN_RAMSCH].t[ln]);
2982     }
2983     else {
2984       if (stich==1) {
2985 	sa[ln][0]=0;
2986       }
2987       else if ((spgew && schwz) || !nullv) {
2988 	strcpy(sa[ln],textarr[TX_DAS_SPIEL_SCHWARZ].t[ln]);
2989       }
2990       else {
2991 	sprintf(sa[ln],textarr[TX_MIT_N_ZU_M_AUGEN].t[ln],stsum,120-stsum);
2992       }
2993     }
2994     sprintf(sw[ln],"%s %d.",textarr[TX_DER_SPIELWERT_IST].t[ln],
2995 	    spgew && (trumpf!=5 || stsum==120)?spwert:-spwert);
2996     if (be>1) sprintf(txt[ln],textarr[TX_N_BOCK_EREIGNISSE].t[ln],be);
2997     else strcpy(txt[ln],textarr[TX_BOCK_EREIGNIS].t[ln]);
2998   }
2999   for (i=0;i<3;i++) {
3000     sprintf(diresult[16+i].str->t[0],"%d/%d",cgewoverl[i][0],cgewoverl[i][1]);
3001   }
3002   for (sn=0;sn<numsp;sn++) {
3003     for (i=0;i<3;i++) {
3004       sprintf(su[sn][i],"%d",sum[i][alist[sn]]);
3005       diresult[12+i].str=&tsu[sn][i];
3006       for (ln=0;ln<NUM_LANG;ln++) {
3007 	tsu[sn][i].t[ln]=su[sn][i];
3008       }
3009     }
3010     if (numsp>1) {
3011       set_names(dismlres[sn],5);
3012       dismlres[sn][1].str=diresult[2].str;
3013       dismlres[sn][2].str=diresult[3].str;
3014       dismlres[sn][3].str=diresult[4].str;
3015       dismlres[sn][4].str=diresult[5].str;
3016       dismlres[sn][11].str=diresult[12].str;
3017       dismlres[sn][12].str=diresult[13].str;
3018       dismlres[sn][13].str=diresult[14].str;
3019       dismlres[sn][14].str=diresult[16].str;
3020       dismlres[sn][15].str=diresult[17].str;
3021       dismlres[sn][16].str=diresult[18].str;
3022       dismlres[sn][17].str=diresult[19].str;
3023       if (!ini) {
3024 	smlh=dismlres[sn][0].h;
3025 	ini=1;
3026       }
3027       if (be) {
3028 	dismlres[sn][17].spec&=~OB_HIDDEN;
3029 	dismlres[sn][0].h=smlh+1;
3030       }
3031       else {
3032 	dismlres[sn][17].spec|=OB_HIDDEN;
3033 	dismlres[sn][0].h=smlh;
3034       }
3035       di_delres(sn);
3036       resdial[sn]=dismlres[sn];
3037       if (actdial[sn]) remove_di(sn);
3038       create_dial(sn,(desk[sn].w-resdial[sn][0].w*charw[sn])/2,
3039 		  5,3,resdial[sn]);
3040       dismlres[sn][11].spec|=spieler==0?OB_SELECTED:OB_NONE;
3041       dismlres[sn][12].spec|=spieler==1?OB_SELECTED:OB_NONE;
3042       dismlres[sn][13].spec|=spieler==2?OB_SELECTED:OB_NONE;
3043       if (spgew &&
3044 	  (alist[sn]==1 || (trumpf==5 && stsum!=120))) {
3045 	dismlres[sn][11].spec^=OB_SELECTED;
3046 	dismlres[sn][12].spec^=OB_SELECTED;
3047 	dismlres[sn][13].spec^=OB_SELECTED;
3048       }
3049       if (trumpf==5 && spwert==0) {
3050 	dismlres[sn][11].spec=dismlres[sn][12].spec=dismlres[sn][13].spec&=
3051 	  ~OB_SELECTED;
3052       }
3053       phase=GEBEN;
3054     }
3055     else {
3056       if (sx && sy) {
3057 	if ((trumpf==5 && sn==ausspl) || handsp) {
3058 	  if (sx>desk[sn].w/2) {
3059 	    sx-=(strlen(textarr[TX_IM_SKAT_IST].t[lang[sn]])+0)*
3060 	      charw[sn];
3061 	  }
3062 	  v_gtextnc(sn,0,0,sx,sy,0,textarr[TX_IM_SKAT_IST].t[lang[sn]]);
3063 	}
3064 	else {
3065 	  if (sx>desk[sn].w/2) {
3066 	    sx-=(strlen(textarr[TX_URSPRUENG_SKAT].t[lang[sn]])+0)*
3067 	      charw[sn];
3068 	  }
3069 	  v_gtextnc(sn,0,0,sx,sy,0,textarr[TX_URSPRUENG_SKAT].t[lang[sn]]);
3070 	}
3071       }
3072       set_names(diresult,6);
3073       di_resultdi(sn);
3074     }
3075   }
3076 }
3077 
di_delres(sn)3078 VOID di_delres(sn)
3079 int sn;
3080 {
3081   if (resdial[sn]) {
3082     remove_dial(sn,resdial[sn]);
3083     resdial[sn]=0;
3084   }
3085 }
3086 
di_options(sn)3087 VOID di_options(sn)
3088 int sn;
3089 {
3090   int i,f,ln;
3091   static char txt[3][NUM_LANG][20];
3092   static tx_typ tt[3];
3093 
3094   f=sn<0;
3095   if (f) {
3096     sn=0;
3097   }
3098   else {
3099     dioptions[sn][23].spec=OB_HIDDEN;
3100     dioptions[sn][24].spec=OB_HIDDEN;
3101   }
3102   if (!sn) firstgame=0;
3103   for (i=0;i<3;i++) {
3104     if (dioptions[sn][14+i].str!=OB_NONE) {
3105       dioptions[sn][14+i].str=&stichstr[blatt[sn]>=2][sn][i];
3106     }
3107   }
3108   if (dioptions[sn][12].str!=&textarr[TX_GESPIELT_WIRD]) {
3109     dioptions[sn][12].str=&spielstr[blatt[sn]>=2][sn];
3110   }
3111   dioptions[sn][10].str=bockspiele?&tt[sn]:OB_NONE;
3112   for (ln=0;ln<NUM_LANG;ln++) {
3113     tt[sn].t[ln]=txt[sn][ln];
3114     sprintf(txt[sn][ln],"%s %d",textarr[TX_BOCK_SPIELE].t[ln],bockspiele);
3115   }
3116   dioptions[sn][19].spec=splstp||splres||
3117     (irc_play && (sum[0][0] || sum[0][1] || sum[0][2] ||
3118 		  sum[1][0] || sum[1][1] || sum[1][2] ||
3119 		  sum[2][0] || sum[2][1] || sum[2][2]))
3120       ?OB_EXIT:OB_HIDDEN;
3121   dioptions[sn][19].str=&textarr[splres?TX_PROTOKOLL:TX_SPIELLISTE];
3122   dioptions[sn][17].spec=
3123     schenken && !schenkstufe && trumpf<=4 && stich==1 &&
3124       phase==SPIELEN && sn!=spieler && (ausspl+vmh)%3==sn
3125 	?OB_EXIT:OB_HIDDEN;
3126   dioptions[sn][18].spec=OB_HIDDEN;
3127   if (f) {
3128     dioptions[sn][23].spec=OB_CENTERED|OB_BOLD;
3129     dioptions[sn][24].spec=OB_CENTERED|OB_BOLD;
3130   }
3131   else if (numsp==1 && phase!=SPIELEN && !irc_play) {
3132     dioptions[sn][18].spec=OB_EXIT;
3133   }
3134   dioptions[sn][14].spec=
3135     dioptions[sn][15].spec=
3136       dioptions[sn][16].spec=
3137 	(dioptions[sn][17].spec==OB_EXIT ||
3138 	 dioptions[sn][18].spec==OB_EXIT)
3139 	  ?OB_HIDDEN:OB_NONE;
3140   create_di(sn,dioptions[sn]);
3141   dioptions[sn][5-sort1[sn]].spec|=OB_SELECTED;
3142   dioptions[sn][7-alternate[sn]].spec|=OB_SELECTED;
3143   dioptions[sn][9-sort2[sn]].spec|=OB_SELECTED;
3144 }
3145 
di_copyr(sn)3146 VOID di_copyr(sn)
3147 int sn;
3148 {
3149   if (!sn && !dlhintseen) dlhintseen=2;
3150   if (ggcards) {
3151     create_di(sn,dicopyr[sn]);
3152   }
3153   else {
3154     create_di(sn,dicopyralt[sn]);
3155   }
3156 }
3157 
di_grafik(sn)3158 VOID di_grafik(sn)
3159 int sn;
3160 {
3161   static tx_typ tt[2];
3162   int ln;
3163   char buf[40];
3164 
3165   sprintf(buf,"%s %s",usrname[0],usrname[1]);
3166   extractnamln(3,buf,0);
3167   if (!spnames[0][0][0][0]) {
3168     strcpy(usrname[0],"?");
3169     strcpy(usrname[1],"");
3170   }
3171   else {
3172     strcpy(usrname[0],spnames[0][0][0]);
3173     strcpy(usrname[1],spnames[0][1][0]);
3174   }
3175   for (ln=0;ln<NUM_LANG;ln++) {
3176     tt[0].t[ln]=usrname[0];
3177     tt[1].t[ln]=usrname[1];
3178   }
3179   digrafik[sn][11].str=&tt[0];
3180   digrafik[sn][12].str=&tt[1];
3181   if (irc_play || numsp>1) {
3182     digrafik[sn][10].spec=
3183       digrafik[sn][11].spec=
3184 	digrafik[sn][12].spec=OB_HIDDEN;
3185   }
3186   create_diopt(sn,digrafik[sn]);
3187   digrafik[sn][3+blatt[sn]].spec|=OB_SELECTED;
3188   digrafik[sn][8+lang[sn]].spec|=OB_SELECTED;
3189 }
3190 
di_strateg(sn)3191 VOID di_strateg(sn)
3192 int sn;
3193 {
3194   static tx_typ tt[3][4];
3195   int i,dis,ln;
3196   char buf[40];
3197 
3198   dis=irc_play || numsp>2?OB_DISABLED:OB_NONE;
3199   for (i=0;i<5;i++) {
3200     distrateg[sn][i+4].spec|=dis;
3201   }
3202   dis=irc_play || numsp>1?OB_HIDDEN:OB_NONE;
3203   for (i=0;i<5;i++) {
3204     distrateg[sn][i+10].spec|=dis;
3205   }
3206   dis=irc_play || numsp>1?OB_HIDDEN:OB_NONE;
3207   distrateg[sn][3].spec=distrateg[sn][9].spec=dis;
3208   ln=lang[sn];
3209   sprintf(buf,"%s %s",conames[0][0],conames[0][1]);
3210   extractnamln(3,buf,ln);
3211   if (!spnames[3][0][ln][0]) {
3212     strcpy(conames[0][0],textarr[TX_COMPUTER].t[ln]);
3213     strcpy(conames[0][1],textarr[TX_LINKS].t[ln]);
3214   }
3215   else {
3216     strcpy(conames[0][0],spnames[3][0][ln]);
3217     strcpy(conames[0][1],spnames[3][1][ln]);
3218   }
3219   sprintf(buf,"%s %s",conames[1][0],conames[1][1]);
3220   extractnamln(3,buf,ln);
3221   if (!spnames[3][0][ln][0]) {
3222     strcpy(conames[1][0],textarr[TX_COMPUTER].t[ln]);
3223     strcpy(conames[1][1],textarr[TX_RECHTS].t[ln]);
3224   }
3225   else {
3226     strcpy(conames[1][0],spnames[3][0][ln]);
3227     strcpy(conames[1][1],spnames[3][1][ln]);
3228   }
3229   tt[sn][0].t[ln]=conames[0][0];
3230   tt[sn][1].t[ln]=conames[1][0];
3231   tt[sn][2].t[ln]=conames[0][1];
3232   tt[sn][3].t[ln]=conames[1][1];
3233   distrateg[sn][19].str=&tt[sn][0];
3234   distrateg[sn][20].str=&tt[sn][1];
3235   distrateg[sn][21].str=&tt[sn][2];
3236   distrateg[sn][22].str=&tt[sn][3];
3237   dis=irc_play || numsp>1?OB_HIDDEN:OB_NONE;
3238   for (i=0;i<5;i++) {
3239     distrateg[sn][18+i].spec|=dis;
3240   }
3241   create_diopt(sn,distrateg[sn]);
3242   distrateg[sn][strateg[0]+8].spec|=OB_SELECTED;
3243   distrateg[sn][strateg[1]+14].spec|=OB_SELECTED;
3244   distrateg[sn][hints[sn]+16].spec|=OB_SELECTED;
3245 }
3246 
di_varianten(sn)3247 VOID di_varianten(sn)
3248 int sn;
3249 {
3250   divarianten[sn][0].next=irc_play?OB_DISABLED:OB_NONE;
3251   create_diopt(sn,divarianten[sn]);
3252   divarianten[sn][3+playramsch].spec|=OB_SELECTED;
3253   divarianten[sn][7+playkontra].spec|=OB_SELECTED;
3254   divarianten[sn][11+playbock].spec|=OB_SELECTED;
3255   divarianten[sn][15+spitzezaehlt].spec|=OB_SELECTED;
3256   divarianten[sn][19+revolution].spec|=OB_SELECTED;
3257   divarianten[sn][22+klopfen].spec|=OB_SELECTED;
3258   divarianten[sn][25+schenken].spec|=OB_SELECTED;
3259   divarianten[sn][28+oldrules].spec|=OB_SELECTED;
3260 }
3261 
di_ramschopts(sn)3262 VOID di_ramschopts(sn)
3263 int sn;
3264 {
3265   diramschopts[sn][0].next=irc_play?OB_DISABLED:OB_NONE;
3266   create_diopt(sn,diramschopts[sn]);
3267   diramschopts[sn][3+playsramsch].spec|=OB_SELECTED;
3268   diramschopts[sn][6+rskatloser].spec|=OB_SELECTED;
3269 }
3270 
di_bockevents(sn)3271 VOID di_bockevents(sn)
3272 int sn;
3273 {
3274   int i,j;
3275 
3276   dibockevents[sn][0].next=irc_play?OB_DISABLED:OB_NONE;
3277   create_diopt(sn,dibockevents[sn]);
3278   for (i=1,j=0;i<=BOCK_BEI_LAST;i*=2,j++) {
3279     if (bockevents&i) {
3280       dibockevents[sn][2+j].spec|=OB_SELECTED;
3281     }
3282   }
3283   dibockevents[sn][11+resumebock].spec|=OB_SELECTED;
3284 }
3285 
di_geschwindigkeit(sn)3286 VOID di_geschwindigkeit(sn)
3287 int sn;
3288 {
3289   static char txt[3][NUM_LANG][20];
3290   static tx_typ tt[3],tkl[3],tgr[3];
3291   int i,dis,ln;
3292 
3293   digeschwindigkeit[sn][3].str=&tt[sn];
3294   for (ln=0;ln<NUM_LANG;ln++) {
3295     tt[sn].t[ln]=txt[sn][ln];
3296   }
3297   prverz(sn);
3298   dis=irc_play && nimmstich[sn][0]>=101?OB_DISABLED|OB_EXIT:OB_EXIT;
3299   for (i=0;i<3;i++) {
3300     for (ln=0;ln<NUM_LANG;ln++) {
3301       tkl[i].t[ln]="<<<"+i;
3302       tgr[i].t[ln]=">>>"+2-i;
3303     }
3304     digeschwindigkeit[sn][4+i].str=&tkl[i];
3305     digeschwindigkeit[sn][4+i].spec=dis;
3306     digeschwindigkeit[sn][7+i].str=&tgr[i];
3307     digeschwindigkeit[sn][7+i].spec=dis;
3308     digeschwindigkeit[sn][14+i].spec=irc_play?OB_DISABLED|OB_BUTTON:OB_BUTTON;
3309   }
3310   create_diopt(sn,digeschwindigkeit[sn]);
3311   digeschwindigkeit[sn][12-fastdeal].spec|=OB_SELECTED;
3312   digeschwindigkeit[sn][14+abkuerz[sn]].spec|=OB_SELECTED;
3313 }
3314 
di_mehrspieler(sn)3315 VOID di_mehrspieler(sn)
3316 int sn;
3317 {
3318   create_diopt(sn,dimehrspieler);
3319 }
3320 
di_lanspiel(sn)3321 VOID di_lanspiel(sn)
3322 int sn;
3323 {
3324   create_di(sn,dilanspiel);
3325 }
3326 
di_eigenertisch(sn)3327 VOID di_eigenertisch(sn)
3328 int sn;
3329 {
3330   static tx_typ tt1,tt2;
3331   int ln;
3332 
3333   for (ln=0;ln<NUM_LANG;ln++) {
3334     tt1.t[ln]=lanip[1];
3335     tt2.t[ln]=lanip[2];
3336   }
3337   dieigenertisch[6].str=&tt1;
3338   dieigenertisch[11].str=&tt2;
3339   create_di(sn,dieigenertisch);
3340   if (!laninvite[0] && !laninvite[1]) laninvite[0]=1;
3341   dieigenertisch[4-laninvite[0]].spec|=OB_SELECTED;
3342   dieigenertisch[9-laninvite[1]].spec|=OB_SELECTED;
3343 }
3344 
di_anderertisch(sn)3345 VOID di_anderertisch(sn)
3346 int sn;
3347 {
3348   static tx_typ tt0;
3349   int ln;
3350 
3351   for (ln=0;ln<NUM_LANG;ln++) {
3352     tt0.t[ln]=lanip[0];
3353   }
3354   dianderertisch[4].str=&tt0;
3355   create_di(sn,dianderertisch);
3356 }
3357 
di_warteauf(sn,u,s2,s3)3358 VOID di_warteauf(sn,u,s2,s3)
3359 int sn,u,s2,s3;
3360 {
3361   static tx_typ tt2,tt3;
3362   static char txt2[80],txt3[80];
3363   static int st2,st3;
3364   int ln;
3365 
3366   if (u) {
3367     if (st2==s2 && st3==s3) return;
3368     st2=s2;
3369     st3=s3;
3370   }
3371   else {
3372     st2=laninvite[0];
3373     st3=laninvite[1];
3374   }
3375   sprintf(txt2,textarr[TX_WARTEN_AUF_SPIELER_N].t[lang[sn]],2);
3376   sprintf(txt3,textarr[TX_WARTEN_AUF_SPIELER_N].t[lang[sn]],3);
3377   for (ln=0;ln<NUM_LANG;ln++) {
3378     tt2.t[ln]=txt2;
3379     tt3.t[ln]=txt3;
3380   }
3381   diwarteauf[2].str=&tt2;
3382   diwarteauf[3].str=&tt3;
3383   diwarteauf[2].spec=st2?OB_CENTERED:OB_HIDDEN;
3384   diwarteauf[3].spec=st3?OB_CENTERED:OB_HIDDEN;
3385   create_di(sn,diwarteauf);
3386 }
3387 
di_irc(sn)3388 VOID di_irc(sn)
3389 int sn;
3390 {
3391   static tx_typ tt;
3392   int ln;
3393 
3394   for (ln=0;ln<NUM_LANG;ln++) {
3395     tt.t[ln]=irc_hostname;
3396   }
3397   diirc[3].str=&tt;
3398   create_di(sn,diirc);
3399 }
3400 
di_eingabe(sn)3401 VOID di_eingabe(sn)
3402 int sn;
3403 {
3404   static char txt[5][2];
3405   static tx_typ tt[5];
3406   int i,ln;
3407 
3408   for (i=0;i<5;i++) {
3409     for (ln=0;ln<NUM_LANG;ln++) {
3410       tt[i].t[ln]=txt[i];
3411     }
3412     sprintf(txt[i],"%d",i+1);
3413     digui[sn][4+i].str=&tt[i];
3414   }
3415   create_diopt(sn,digui[sn]);
3416   digui[sn][3+mbutton[sn]].spec|=OB_SELECTED;
3417   digui[sn][10+keyboard[sn]].spec|=OB_SELECTED;
3418   digui[sn][14+briefmsg[sn]].spec|=OB_SELECTED;
3419   digui[sn][17+trickl2r[sn]].spec|=OB_SELECTED;
3420 }
3421 
di_wieder(sn,f)3422 VOID di_wieder(sn,f)
3423 int sn,f;
3424 {
3425   if (f) {
3426     diwieder[11].spec&=~OB_HIDDEN;
3427   }
3428   else {
3429     diwieder[11].spec|=OB_HIDDEN;
3430   }
3431   create_di(sn,diwieder);
3432   diwieder[6].spec|=OB_SELECTED;
3433   diwieder[9+vorhandwn].spec|=OB_SELECTED;
3434 }
3435 
di_input(sn,ti,di,buf,len)3436 VOID di_input(sn,ti,di,buf,len)
3437 int sn,ti,di;
3438 char *buf;
3439 int len;
3440 {
3441   static tx_typ tt[3],tx[3];
3442   static char txt[3][80];
3443   int ln;
3444 
3445   if (len>35) {
3446     buf[35]=0;
3447     len=35;
3448   }
3449   strcat(buf,"_");
3450   inputdi[sn]=di;
3451   inputbuf[sn]=buf;
3452   inputlen[sn]=len;
3453   sprintf(txt[sn]," %s ",textarr[ti].t[lang[sn]]);
3454   for (ln=0;ln<NUM_LANG;ln++) {
3455     tt[sn].t[ln]=buf;
3456     tx[sn].t[ln]=txt[sn];
3457   }
3458   diinput[sn][1].str=&tx[sn];
3459   diinput[sn][2].str=&tt[sn];
3460   create_di(sn,diinput[sn]);
3461 }
3462