1 #include "xrisk.h"
2 #include "randomex.h"
3 #include "risklibex.h"
4 #include "xrisklibex.h"
5 #include "xriskex.h"
6 
7 /* Give player a card */
get_card()8 cardp get_card()
9 {
10   int   t;
11   cardp retur;
12 
13   for(t=0;cards[t];t++);
14   if (!t) risk_exit("To few cards in get_card\n",LAST_ARG);
15   retur=cards[t-1];
16   cards[t-1]=NULL;
17   return(retur);
18 }
19 
20 /* Get kard from player */
deliver_card(card)21 void deliver_card(card)
22      cardp card;
23 {
24   int t,t1;
25 
26   for(t=0;cards[t];t++);
27   cards[t++] = card;
28   if (t > NUM_CARDS) risk_exit("To many cards in deliver_card\n",LAST_ARG);
29   cards[t] = NULL;
30   t1       = Random(t);
31   Switch(cards[t-1],cards[t1],card);
32 }
33 
34 /* Remove a card from the list */
sub_card(player,cardnr)35 void sub_card(player,cardnr)
36      playerp player;
37      int cardnr;
38 {
39   card_winp     cardwin;
40   struct Card **card;
41 
42   cardwin = player->card_win;
43   card    = player->card;
44 
45   XDestroyImage(cardwin->gimage[cardnr]);
46   for(;card[cardnr] && cardnr+1 < CARDS_MAX_PLAYER;cardnr++)
47     {
48       card[cardnr]            = card[cardnr+1];
49       cardwin->gimage[cardnr] = cardwin->gimage[cardnr+1];
50     }
51   if ((cardnr+1 == CARDS_MAX_PLAYER) && (card[cardnr])) risk_exit
52     ("Non-null terminatet card-list for %s\n",player->name);
53   update_infowin(player,-1,U_CARDS);
54 }
55 
56 /* Give player a card */
add_card(player,card)57 void add_card(player, card)
58      playerp player;
59      cardp card;
60 {
61   char         *temp;
62   card_winp     cardwin;
63   int           cardnr,t;
64   xconp         xinfo;
65 
66   temp                   = (char *)malloc(BORDERX*BORDERY);
67   xinfo                  = player->xcon;
68   cardwin                = player->card_win;
69   cardnr                 = player->num_cards;
70   player->card[cardnr]   = card;
71   player->card[cardnr+1] = NULL;
72 
73   for(t=0;t<BORDERX*BORDERY;t++)
74     if (card->border[t]) temp[t] = (xinfo->white & 255);
75     else                 temp[t] = (xinfo->black & 255);
76 
77   cardwin->gimage[cardnr] = XCreateImage
78     (xinfo->disp,xinfo->visual,xinfo->depth,
79      ZPixmap,0,temp,BORDERX,BORDERY,8,0);
80 
81   update_infowin(player,1,U_CARDS);
82 }
83 
84 /* Show whether you have selected the card */
show_chosen_card(xinfo,cardwin,t)85 void show_chosen_card(xinfo, cardwin, t)
86      xconp     xinfo;
87      card_winp cardwin;
88      int       t;
89 {
90   if (Chosen(cardwin->chosen,t)) write_line
91     (xinfo,cardwin->buttons[t],-1,-1,0,FILLH+FONTH,C_WIDTH,-1,
92      cardwin->card[t]->unit,CLR|CENTER);
93   else write_line
94     (xinfo,cardwin->buttons[t],-1,-1,0,FILLH+FONTH,C_WIDTH,-1,"",CLR);
95 }
96 
97 /* (Re)Draw a card */
draw_chosen_card(player,xinfo,cardwin,t)98 void draw_chosen_card(player, xinfo, cardwin, t)
99      playerp player;
100      xconp xinfo;
101      card_winp cardwin;
102      int t;
103 {
104   if (t < player->num_cards)
105     {
106       XPutImage(xinfo->disp,cardwin->cards[t],xinfo->gc,
107 		cardwin->aimage[cardwin->card[t]->indexunit],
108 		0,0,0,0,UNITX,UNITY);
109       write_line(xinfo,cardwin->cards[t],-1,-1,0,UNITY+2*FILLH+FONTH,
110 		 C_WIDTH,-1,cardwin->card[t]->name,CLR|CENTER);
111       XPutImage(xinfo->disp,cardwin->cards[t],xinfo->gc,cardwin->gimage[t],
112 		0,0,0,C_HEIGHT-BORDERY,BORDERX,BORDERY);
113     }
114   else
115     {
116       XSetForeground(xinfo->disp,xinfo->gc,xinfo->black);
117       XFillRectangle(xinfo->disp,cardwin->cards[t],xinfo->gc,
118 		     0,0,C_WIDTH,C_HEIGHT);
119     }
120   show_chosen_card(xinfo,cardwin,t);
121 }
122 
123 /* Redraw the card-window */
update_cardwin(player)124 int update_cardwin(player)
125      playerp player;
126 {
127   int   t;
128 
129   if (!player->xcon) return(1);
130   for(t=0;t<CARDS_MAX_SHOWN;t++)
131     draw_chosen_card(player, player->xcon, player->card_win, t);
132   return(0);
133 }
134 
135 /* When we have to redraw sth. in the cardwin after an exposure-event */
expose_card_button(player,number)136 int expose_card_button(player, number)
137      playerp player;
138      int number;
139 {
140   if (number >= player->num_cards) return(1);
141   show_chosen_card(player->xcon, player->card_win, number);
142   return(0);
143 }
144 
145 /* When we have to redraw sth. in the cardwin after an exposure-event */
expose_card_win(player,number)146 int expose_card_win(player, number)
147      playerp player;
148      int number;
149 {
150   if (number<CARDS_MAX_SHOWN)
151     draw_chosen_card(player, player->xcon, player->card_win, number);
152   return(0);
153 }
154 
155 /* Transfer all cards from one player to another */
transfer_all_cards(from,target)156 int transfer_all_cards(from, target)
157      playerp from;
158      playerp target;
159 {
160   int   t;
161 
162   if ( !(t = from->num_cards) ) return(0);
163 
164   while(from->card[0])
165     {
166       add_card(target,from->card_win->card[0]);
167       sub_card(from,0);
168     }
169   if (t==1) write_msg_all_arg
170     ("#028_Doing this %s gained %d new card",target->name,t,LAST_ARG);
171   else write_msg_all_arg
172     ("#029_Doing this %s gained %d new cards",target->name,t,LAST_ARG);
173 
174   target->card_win->chosen   = 0;
175   from->card_win->chosen     = 0;
176   target->card_win->exchange = 0;
177   from->card_win->exchange   = 0;
178   update_cardwin(target);
179   update_cardwin(from);
180   return(t);
181 }
182 
183 /* Returns value of the cards you have chosen */
value_of_card(cardwin)184 int value_of_card(cardwin)
185      card_winp cardwin;
186 {
187   int h=0,t;
188 
189   cardwin->exchange = 0;
190 
191   for(t=0;cardwin->card[t];t++)
192     if (Chosen(cardwin->chosen,t)) h+=cardwin->card[t]->value;
193 
194   if ( (h == 3*V_UNIT0) || (h == 2*V_UNIT0 + V_JOKER) ) cardwin->exchange =  4;
195   if ( (h == 3*V_UNIT1) || (h == 2*V_UNIT1 + V_JOKER) ) cardwin->exchange =  6;
196   if ( (h == 3*V_UNIT2) || (h == 2*V_UNIT2 + V_JOKER) ) cardwin->exchange =  8;
197   if (   ( h == V_UNIT0 + V_UNIT1 + V_UNIT2  )
198       || ( h == V_JOKER + V_UNIT1 + V_UNIT2  )
199       || ( h == V_UNIT0 + V_JOKER + V_UNIT2  )
200       || ( h == V_UNIT0 + V_UNIT1 + V_JOKER )
201       || ( h == V_JOKER + V_JOKER + V_UNIT2  )
202       || ( h == V_JOKER + V_UNIT1 + V_JOKER )
203       || ( h == V_UNIT0 + V_JOKER + V_JOKER ) )       cardwin->exchange = 10;
204   return(cardwin->exchange);
205 }
206 
207 /* Remove all cards from a player */
remove_all_cards_player(player)208 void remove_all_cards_player(player)
209      playerp player;
210 {
211   struct Card **card;
212   card_winp     cardwin;
213 
214   cardwin           = player->card_win;
215   card              = cardwin->card;
216   cardwin->chosen   = 0;
217   cardwin->exchange = 0;
218   while(card[0])
219     {
220       deliver_card(card[0]);
221       sub_card(player,0);
222     }
223   update_cardwin(player);
224 }
225 
226 /* Switch cards in the table */
switch_card(cardwin,k1,k2)227 void switch_card(cardwin, k1, k2)
228      card_winp cardwin;
229      int k1, k2;
230 {
231   XImage *swimage;
232   cardp   swcard;
233 
234   Switch(cardwin->gimage[k1],cardwin->gimage[k2],swimage);
235   Switch(cardwin->card[k1]  ,cardwin->card[k2],swcard);
236 }
237 
238 /* Give a player his card */
give_player_card(player)239 void give_player_card(player)
240      playerp player;
241 {
242   cardp card;
243 
244   card = get_card();
245   add_card(player,card);
246   update_cardwin(player);
247 }
248 
249 /* change cards if it is egal */
exchanges_cards(cardwin)250 int exchanges_cards(cardwin)
251      card_winp cardwin;
252 {
253   int           retur,t;
254   struct Card **card;
255 
256   if (! (retur=value_of_card(cardwin)) ) return(0);
257 
258   card = cardwin->card;
259 
260   for(t=cardwin->player->num_cards-1;t>=0;t--) if (Chosen(cardwin->chosen,t))
261     {
262       if (card[t]->occupant==cardwin->player)
263 	{
264 	  add_armies(card[t],2,UPDATE);
265 	  write_msg_all_arg("#009_%s gets 2 armies in %s",
266 				 cardwin->player->name,card[t]->name,LAST_ARG);
267 	}
268       deliver_card(card[t]);
269       sub_card(cardwin->player,t);
270     }
271 
272   cardwin->chosen   = 0;
273   cardwin->exchange = 0;
274   update_cardwin(cardwin->player);
275   write_msg_all_arg("#004_%s exchanged cards for %d armies",
276 			 cardwin->player->name,retur,LAST_ARG);
277   return(retur);
278 }
279 
280 /* change cards */
exchange_card(player)281 int exchange_card(player)
282      playerp player;
283 {
284   card_winp cardwin;
285 
286   cardwin                       = player->card_win;
287   player->pstat->armies_left   += exchanges_cards(cardwin);
288   if ((player->pstat->armies_max = player->pstat->armies_left))
289     write_msg_arg(player,"#059_You have %d armies to place"
290 		  ,player->pstat->armies_left,LAST_ARG);
291   return(0);
292 }
293