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