cleaned all trailing white space from source files.
[sdk] / samples / games / cards / ruff / src / server.ec
1 import "ruff.ec"
2
3 bool RUFF_Legal(RuffGame game, Player player, int card)
4 {
5    bool legal = false;
6    if(player.cards[card].kind != none)
7    {
8       legal = true;
9            if(game.start != player.id)
10       {
11          int c;
12          bool canSupply = false;
13          Kind kind = game.played[game.start].kind;
14                    for(c=0; c<9; c++)
15                            if(player.cards[c].kind == kind)
16             {
17                                    canSupply=true;
18                break;
19             }
20               if(canSupply && player.cards[card].kind != kind)
21                       legal = false;
22       }
23    }
24         return legal;
25 }
26
27 int RUFF_CardScore(RuffGame game, Kind kind, Number number)
28 {
29    Round * round = &game.rounds[game.round];
30    Kind setKind = game.played[game.start].kind;
31    int score = 0;
32    if(kind == setKind)
33       score = 1 + number;
34    else if(kind == round->bet.trump)
35       score = 10 + number;
36    return score;
37 }
38
39 PlayerPosition RUFF_HandWinner(RuffGame game, int * points, int * maxScore)
40 {
41    PlayerPosition winner = none;
42    PlayerPosition c;
43    *points = 0;
44    *maxScore = 0;
45
46    for(c = 0; c<4; c++)
47    {
48       if(game.played[c].kind != none)
49       {
50          int score;
51
52                    switch(game.played[c].number)
53                    {
54                            case _5: *points += 5;  break;
55                            case _10: case ace: *points += 10; break;
56                    }
57          score = RUFF_CardScore(game, game.played[c].kind, game.played[c].number);
58                    if(score >= *maxScore)
59                    {
60                            *maxScore = score;
61                            winner = c;
62                    }
63       }
64    }
65    return winner;
66 }
67
68 static void Server_ShuffleDeck(Card * deck)
69 {
70    int t;
71    int count;
72
73    RandomSeed((int)(GetTime() * 1000));
74
75    count = GetRandom(1000, 2000);
76    for(t = 0; t<count; t++)
77    {
78       // cut the deck in 2
79       Card cuts[2][NUMCARDS];
80       int numCut[2];
81       int indexCut[2] = {0,0};
82       int cut = GetRandom(NUMCARDS / 4, NUMCARDS * 3 / 4);
83       int c;
84
85       for(c = 0; c<cut; c++)
86          cuts[0][c] = deck[c];
87       for(c = cut; c<NUMCARDS; c++)
88          cuts[1][c - cut] = deck[c];
89
90       numCut[0] = cut;
91       numCut[1] = NUMCARDS - cut;
92
93       // Mix the cards
94       for(c = 0; c<NUMCARDS; c++)
95       {
96          int whichCut;
97
98          if(indexCut[0] < numCut[0] && indexCut[1] < numCut[1])
99             whichCut = GetRandom(0,1);
100          else if(indexCut[0] < numCut[0])
101             whichCut = 0;
102          else if(indexCut[1] < numCut[1])
103             whichCut = 1;
104
105          deck[c] = cuts[whichCut][indexCut[whichCut]++];
106       }
107    }
108 }
109
110 static int CompareCards(const Card * card1, const Card * card2)
111 {
112    if(card1->kind > card2->kind)
113       return 1;
114    else if(card1->kind < card2->kind)
115       return -1;
116    else if(card1->number < card2->number)
117       return 1;
118    else if(card1->number > card2->number)
119       return -1;
120    else
121       return 0;
122 }
123
124 static void Server_Deal(RuffGame game)
125 {
126    int c;
127    Round * round = &game.rounds[game.round];
128    static Card deck[NUMCARDS];
129
130    // Initialize the deck
131    for(c = 0; c<NUMCARDS; c++)
132    {
133       deck[c].kind = (Kind)(c / 9);
134       deck[c].number = (Number)(c % 9);
135    }
136
137    Server_ShuffleDeck(deck);
138
139    for(c=0; c<4; c++)
140    {
141       // Extra cards for ruff...
142       game.players[c].cards[9].kind = none;
143       game.players[c].cards[10].kind = none;
144    }
145
146    for(c = 0; c<NUMCARDS; c++)
147    {
148       Player * player = &game.players[(round->shuffle + c) % 4];
149       player->cards[c / 4] = deck[c];
150    }
151
152    for(c = 0; c<4; c++)
153       qsort(game.players[c].cards, 9, sizeof(Card), CompareCards);
154
155    round->bet.howMuch = 0;
156    round->bet.player = none;
157    round->bet.trump = none;
158
159    game.turn = game.start = (round->shuffle + 1) % 4;
160    game.cardSet = 0;
161    game.betting = true;
162    round->scores[0] = round->scores[1] = 0;
163
164    for(c = 0; c<4; c++)
165       Player_InformNewRound(&game.players[c], game.round, round->shuffle, game.players[c].cards);
166
167    Player_RequestBet(&game.players[game.turn]);
168 }
169
170 void Server_StartGame(RuffGame game)
171 {
172    int c;
173
174    // New Game
175    RandomSeed((int)(GetTime() * 1000));
176    game.rounds[0].shuffle = (PlayerPosition)GetRandom(0, 3);
177    game.round = 0;
178    game.gameStarted = true;
179    for(c = 0; c<4; c++)
180       game.played[c].kind = none;
181
182    for(c = 0; c<4; c++)
183       Player_InformStartGame(&game.players[c]);
184    Server_Deal(game);
185 }
186
187 void Server_StopGame(RuffGame game)
188 {
189   int c;
190
191    // New Game
192    game.gameStarted = false;
193
194    for(c = 0; c<4; c++)
195       Player_InformStopGame(&game.players[c]);
196 }
197
198 void Server_PlaceBet(RuffGame game, Player player, int bet)
199 {
200    Round * round = &game.rounds[game.round];
201    if(!bet ||
202       (bet >= 40 && bet <= 100 && !(bet%5) && bet >= round->bet.howMuch &&
203       (round->shuffle == player.id || bet > round->bet.howMuch)))
204    {
205       int c;
206
207       if(bet || (!round->bet.howMuch && round->shuffle == player.id))
208       {
209          round->bet.howMuch = bet;
210          round->bet.player = game.turn;
211       }
212       game.turn = (game.turn + 1) % 4;
213
214       for(c = 0; c<4; c++)
215          Player_InformBet(&game.players[c], player.id, bet);
216
217       if(game.turn == game.start)
218       {
219          game.turn = game.start = round->bet.player;
220          Player_RequestTrump(&game.players[game.turn]);
221       }
222       else
223          Player_RequestBet(&game.players[game.turn]);
224    }
225    else
226       Player_RequestBet(player);
227 }
228
229 void Server_ChoseTrump(RuffGame game, Player player, Kind trump)
230 {
231    Round * round = &game.rounds[game.round];
232    if(trump >= 0 || trump < 4 || trump == none)
233    {
234       int c;
235
236       round->bet.trump = trump;
237
238       for(c = 0; c<4; c++)
239          Player_InformTrump(&game.players[c], trump);
240
241       for(c = 0; c<4; c++)
242          Player_InformStartHand(&game.players[c], game.start);
243       for(c = 0; c<4; c++)
244          game.played[c].kind = none;
245
246       game.betting = false;
247       Player_RequestCard(&game.players[game.turn]);
248    }
249    else
250       Player_RequestTrump(player);
251 }
252
253 void Server_Ack4Cards(RuffGame game, Player player)
254 {
255    Round * round = &game.rounds[game.round];
256    int c;
257    int totalScores[2] = { 0 };
258
259    game.cardSet++;
260
261    // End of round
262    if(game.cardSet == 9)
263    {
264       for(c = 0; c<game.round; c++)
265       {
266          totalScores[0] += game.rounds[c].scores[0];
267          totalScores[1] += game.rounds[c].scores[1];
268       }
269
270       for(c = 0; c<2; c++)
271       {
272          if((int)round->bet.player % 2 == c && round->scores[c] < round->bet.howMuch)
273             round->scores[c] = -round->bet.howMuch;
274          totalScores[c] += round->scores[c];
275       }
276
277       for(c = 0; c<4; c++)
278          Player_InformEndOfRound(&game.players[c], round->scores[0], round->scores[1]);
279
280       game.round++;
281       game.betting = true;
282
283       if((totalScores[0] < 500 && totalScores[1] < 500) || totalScores[0] == totalScores[1])
284       {
285          game.rounds[game.round].shuffle = (round->shuffle + 1) % 4;
286          Server_Deal(game);
287       }
288       else
289       {
290          for(c = 0; c<4; c++)
291             Player_InformNewRound(&game.players[c], game.round, game.rounds[game.round].shuffle,
292             game.players[c].cards);
293       }
294    }
295    else
296    {
297       for(c = 0; c<4; c++)
298          Player_InformStartHand(&game.players[c], game.start);
299       for(c = 0; c<4; c++)
300          game.played[c].kind = none;
301
302       Player_RequestCard(&game.players[game.turn]);
303    }
304 }
305
306 void Server_PlayCard(RuffGame game, Player player, int card)
307 {
308    if(player.id == game.turn && RUFF_Legal(game, player, card))
309    {
310       int c;
311       Card theCard = player.cards[card];
312
313       for(c = 0; c<4; c++)
314          Player_InformCardPlayed(&game.players[c], player.id,
315             theCard.kind, theCard.number);
316
317       game.played[player.id] = theCard;
318       player.cards[card].kind = none;
319       game.turn = (player.id + 1) % 4;
320
321       // End of set of 4 cards
322       if(game.turn == game.start)
323       {
324          Round * round = &game.rounds[game.round];
325          int points, maxScore;
326          PlayerPosition winner;
327          winner = RUFF_HandWinner(game, &points, &maxScore);
328          round->scores[winner%2] += points;
329
330          for(c = 0; c<4; c++)
331             Player_Request4CardsAck(&game.players[c], winner, round->scores[0], round->scores[1]);
332
333          game.turn = game.start = winner;
334
335          Server_Ack4Cards(player.game, &game.players[0]);
336       }
337       else
338          Player_RequestCard(&game.players[game.turn]);
339    }
340    else
341       Player_RequestCard(player);
342 }
343
344 void Server_SetName(RuffGame game, Player player, char * name)
345 {
346    int c;
347    strcpy(player.name, name);
348    for(c = 0; c<4; c++)
349       Player_InformPlayerInfo(&game.players[c], player.id, name);
350 }