/[maitretarot]/game_server/src/state_machine.c
ViewVC logotype

Diff of /game_server/src/state_machine.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.12 by ymettier, Sat Sep 6 15:09:07 2003 UTC revision 1.13 by ymettier, Sat Sep 6 18:21:22 2003 UTC
# Line 69  say_resume_and_send_cards_in_hand (game_ Line 69  say_resume_and_send_cards_in_hand (game_
69        g_assert (p != NULL);        g_assert (p != NULL);
70        send_message_SAY_resume (sock_id, g);        send_message_SAY_resume (sock_id, g);
71        send_message_SAY_cards_in_hand (sock_id, g, i);        send_message_SAY_cards_in_hand (sock_id, g, i);
72        g->rules->bids[i] = LIBMT_BID_UNDEF;        RULES (g->rules)->bids[i] = LIBMT_BID_UNDEF;
73      }      }
74  }  }
75    
# Line 89  find_out_who_has_to_bid_and_ask_him (gam Line 89  find_out_who_has_to_bid_and_ask_him (gam
89        s1 = g_array_index (g->players, int, turn);        s1 = g_array_index (g->players, int, turn);
90        p1 = g_tree_lookup (config->sock_id, GINT_TO_POINTER (s1));        p1 = g_tree_lookup (config->sock_id, GINT_TO_POINTER (s1));
91        g_assert (p1 != NULL);        g_assert (p1 != NULL);
92        if ((g->rules->bids[turn] == LIBMT_BID_UNDEF)        if ((RULES (g->rules)->bids[turn] == LIBMT_BID_UNDEF)
93            ||            ||
94            ((LIBMT_BID_CMP (g->rules->bids[turn], LIBMT_BID_PASSE)            ((LIBMT_BID_CMP (RULES (g->rules)->bids[turn], LIBMT_BID_PASSE)
95              && LIBMT_BID_CMP (g->rules->bids[turn], g->rules->bid))))              && LIBMT_BID_CMP (RULES (g->rules)->bids[turn],
96                                  RULES (g->rules)->bid))))
97          {          {
98            p1->state = PLAYER_STATE_ASKING_BID;            p1->state = PLAYER_STATE_ASKING_BID;
99            p1->state_change_date = 0;            p1->state_change_date = 0;
# Line 113  send_ask_bids_to_all (game_t * g) Line 114  send_ask_bids_to_all (game_t * g)
114    int i;    int i;
115    for (i = 0; i < g->players->len; i++)    for (i = 0; i < g->players->len; i++)
116      {      {
117        int s1;        int s;
118        player_t *p1;        player_t *p;
119        s1 = g_array_index (g->players, int, i);        s = g_array_index (g->players, int, i);
120        p1 = g_tree_lookup (config->sock_id, GINT_TO_POINTER (s1));        p = g_tree_lookup (config->sock_id, GINT_TO_POINTER (s));
121        g_assert (p1 != NULL);        g_assert (p != NULL);
122        send_ask_bids (s1, p1, 1);        send_ask_bids (s, p, 1);
123      }      }
124    g->state = GAME_STATE_CHECKING_BIDS;    g->state = GAME_STATE_CHECKING_BIDS;
125  }  }
# Line 132  chien_managment (game_t * g) Line 133  chien_managment (game_t * g)
133     * Please do not remove this comment     * Please do not remove this comment
134     * Yves (June 6th 2003)     * Yves (June 6th 2003)
135     */     */
136    if ((LIBMT_BID_CMP (g->rules->bid, LIBMT_BID_PRISE))    if ((LIBMT_BID_CMP (RULES (g->rules)->bid, LIBMT_BID_PRISE))
137        && (LIBMT_BID_CMP (g->rules->bid, LIBMT_BID_GARDE)))        && (LIBMT_BID_CMP (RULES (g->rules)->bid, LIBMT_BID_GARDE)))
138      {      {
139        g->state = GAME_STATE_PLAYING_GAME;        g->state = GAME_STATE_ASKING_CHIEN_DONE;
140      }      }
141    else    else
142      {      {
# Line 151  chien_managment (game_t * g) Line 152  chien_managment (game_t * g)
152            g_assert (p1 != NULL);            g_assert (p1 != NULL);
153            send_info_chien (s1, p1);            send_info_chien (s1, p1);
154          }          }
155        s1 = g_array_index (g->players, int, g->rules->preneur);        s1 = g_array_index (g->players, int, RULES (g->rules)->preneur);
156        p1 = g_tree_lookup (config->sock_id, GINT_TO_POINTER (s1));        p1 = g_tree_lookup (config->sock_id, GINT_TO_POINTER (s1));
157        g_assert (p1 != NULL);        g_assert (p1 != NULL);
158        if (g->nb_players_max == 3)        if (g->nb_players_max == 3)
# Line 164  chien_managment (game_t * g) Line 165  chien_managment (game_t * g)
165        pos = player_get_position (p1);        pos = player_get_position (p1);
166        for (i = 0; i < nb; i++)        for (i = 0; i < nb; i++)
167          {          {
168            g->rules->card_status[g->rules->chien[i]] = pos;            RULES (g->rules)->card_status[RULES (g->rules)->chien[i]] = pos;
169          }          }
170        send_ask_chien (s1, p1);        send_ask_chien (s1, p1);
171        g->state = GAME_STATE_ASKING_CHIEN;        g->state = GAME_STATE_ASKING_CHIEN;
172      }      }
173  }  }
174    
175  void  gboolean
176    test_end_turn (game_t * g)
177    {
178      int previous_winner = g->turn_starter;
179      int winner;
180      int i;
181      winner = g->rule_compute_winner (g, previous_winner);
182    
183      for (i = 0; i < g->nb_players_max; i++)
184        {
185          RULES (g->rules)->card_status[RULES (g->rules)->board[i]] = 10 + winner;
186        }
187    
188      g->turn = winner;
189      g->turn_nb++;
190      if ((g->turn_nb == 15) && (g->nb_players_max == 5))
191        return (TRUE);
192      if ((g->turn_nb == 18) && (g->nb_players_max == 4))
193        return (TRUE);
194      if ((g->turn_nb == 24) && (g->nb_players_max == 3))
195        return (TRUE);
196      return (FALSE);
197    }
198    
199    gboolean
200  play_game (game_t * g)  play_game (game_t * g)
201  {  {
202      int i;
203      int turn = g->turn;
204      gboolean rv;
205      for (i = 0; i < g->nb_players_max; i++)
206        {
207          int s;
208          player_t *p;
209          turn++;
210          if (turn >= g->nb_players_max)
211            turn = 0;
212    
213          s = g_array_index (g->players, int, turn);
214          p = g_tree_lookup (config->sock_id, GINT_TO_POINTER (s));
215          g_assert (p != NULL);
216          if (RULES (g->rules)->board[turn] == -1)
217            {
218              p->state = PLAYER_STATE_ASKING_CARD;
219              p->state_change_date = 0;
220              g->turn = turn;
221              send_waiting_for_player (p);
222              break;
223    
224            }
225        }
226      rv = FALSE;
227      if (i == g->nb_players_max)
228        rv = test_end_turn (g);
229      return (rv);
230  }  }
231    
232  gboolean  gboolean
# Line 217  game_state_machine_cb (gpointer a, gpoin Line 269  game_state_machine_cb (gpointer a, gpoin
269        g->state = GAME_STATE_NOT_PLAYING_GAME;        g->state = GAME_STATE_NOT_PLAYING_GAME;
270        for (i = 0; i < g->nb_players_max; i++)        for (i = 0; i < g->nb_players_max; i++)
271          {          {
272            if (g->rules->bids[i] != LIBMT_BID_PASSE)            if (RULES (g->rules)->bids[i] != LIBMT_BID_PASSE)
273              {              {
274                g_assert (g->rules->bids[i] != LIBMT_BID_UNDEF);                g_assert (RULES (g->rules)->bids[i] != LIBMT_BID_UNDEF);
275                g->state = GAME_STATE_CHIEN_MANAGMENT;                g->state = GAME_STATE_CHIEN_MANAGMENT;
276              }              }
277          }          }
# Line 227  game_state_machine_cb (gpointer a, gpoin Line 279  game_state_machine_cb (gpointer a, gpoin
279    else if (g->state == GAME_STATE_NOT_PLAYING_GAME)    else if (g->state == GAME_STATE_NOT_PLAYING_GAME)
280      {      {
281        /* Do we restart the game here ? */        /* Do we restart the game here ? */
282          g->state = GAME_STATE_PLAY_AGAIN;
283      }      }
284    else if (g->state == GAME_STATE_CHIEN_MANAGMENT)    else if (g->state == GAME_STATE_CHIEN_MANAGMENT)
285      {      {
# Line 238  game_state_machine_cb (gpointer a, gpoin Line 291  game_state_machine_cb (gpointer a, gpoin
291      }      }
292    else if (g->state == GAME_STATE_ASKING_CHIEN_DONE)    else if (g->state == GAME_STATE_ASKING_CHIEN_DONE)
293      {      {
294          int i;
295          for (i = 0; i < 5; i++)
296            RULES (g->rules)->board[i] = -1;
297          g->turn = g->game_turn;
298          g->turn_nb = 0;
299        g->state = GAME_STATE_PLAYING_GAME;        g->state = GAME_STATE_PLAYING_GAME;
300      }      }
301    else if (g->state == GAME_STATE_PLAYING_GAME)    else if (g->state == GAME_STATE_PLAYING_GAME)
302      {      {
303        play_game (g);        if (play_game (g))
304            {
305              g->state = GAME_STATE_END_GAME_RESULTS;
306            }
307        }
308      else if (g->state == GAME_STATE_END_GAME_RESULTS)
309        {
310          /* We should compute the scores here and send them */
311          g->state = GAME_STATE_PLAY_AGAIN;
312        }
313      else if (g->state == GAME_STATE_PLAY_AGAIN)
314        {
315    /* What do we do here to start a new game ? */
316          state_change (g, PLAYER_STATE_PLAY_AGAIN, GAME_STATE_PLAY_AGAIN);
317      }      }
318    return (FALSE);    return (FALSE);
319  }  }
# Line 275  player_state_machine_cb (gpointer k, gpo Line 346  player_state_machine_cb (gpointer k, gpo
346          case PLAYER_STATE_ASKING_BID:          case PLAYER_STATE_ASKING_BID:
347            send_ask_bids (sock_id, p, 0);            send_ask_bids (sock_id, p, 0);
348            break;            break;
349            case PLAYER_STATE_ASKING_CARD:
350              send_ask_card (sock_id, p, 0);
351              break;
352            case PLAYER_STATE_PLAY_AGAIN:
353              protocol_send (sock_id, PROTOCOL_ASK_PLAY_AGAIN, "Do you want to play again (not implemented yet) ?");
354              break;
355          case PLAYER_STATE_UNDEF:          case PLAYER_STATE_UNDEF:
356            protocol_send (sock_id, PROTOCOL_WARNING, "Undefined state");            protocol_send (sock_id, PROTOCOL_WARNING, "Undefined state");
357            break;            break;

Legend:
Removed from v.1.12  
changed lines
  Added in v.1.13

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26