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