/[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.11 by ymettier, Thu Jul 10 13:22:44 2003 UTC revision 1.12 by ymettier, Sat Sep 6 15:09:07 2003 UTC
# Line 41  send_waiting_for_player (player_t * play Line 41  send_waiting_for_player (player_t * play
41      }      }
42  }  }
43    
44    void
45    state_change (game_t * g, int player_state, int game_state)
46    {
47      int i;
48      for (i = 0; i < g->players->len; i++)
49        {
50          int sock_id = g_array_index (g->players, int, i);
51          player_t *p =
52            g_tree_lookup (config->sock_id, GINT_TO_POINTER (sock_id));
53          g_assert (p != NULL);
54          p->state = player_state;
55          p->state_change_date = 0;
56        }
57      g->state = game_state;
58    }
59    
60    void
61    say_resume_and_send_cards_in_hand (game_t * g)
62    {
63      int i;
64      for (i = 0; i < g->players->len; i++)
65        {
66          player_t *p;
67          int sock_id = g_array_index (g->players, int, i);
68          p = g_tree_lookup (config->sock_id, GINT_TO_POINTER (sock_id));
69          g_assert (p != NULL);
70          send_message_SAY_resume (sock_id, g);
71          send_message_SAY_cards_in_hand (sock_id, g, i);
72          g->rules->bids[i] = LIBMT_BID_UNDEF;
73        }
74    }
75    
76    gboolean
77    find_out_who_has_to_bid_and_ask_him (game_t * g)
78    {
79      int turn = g->turn;
80      int i;
81      for (i = 0; i < g->nb_players_max; i++)
82        {
83          int s1;
84          player_t *p1;
85          turn++;
86          if (turn >= g->nb_players_max)
87            turn = 0;
88    
89          s1 = g_array_index (g->players, int, turn);
90          p1 = g_tree_lookup (config->sock_id, GINT_TO_POINTER (s1));
91          g_assert (p1 != NULL);
92          if ((g->rules->bids[turn] == LIBMT_BID_UNDEF)
93              ||
94              ((LIBMT_BID_CMP (g->rules->bids[turn], LIBMT_BID_PASSE)
95                && LIBMT_BID_CMP (g->rules->bids[turn], g->rules->bid))))
96            {
97              p1->state = PLAYER_STATE_ASKING_BID;
98              p1->state_change_date = 0;
99              g->turn = turn;
100              send_waiting_for_player (p1);
101              break;
102    
103            }
104        }
105      if (i == g->nb_players_max)
106        return (FALSE);
107      return (TRUE);
108    }
109    
110    void
111    send_ask_bids_to_all (game_t * g)
112    {
113      int i;
114      for (i = 0; i < g->players->len; i++)
115        {
116          int s1;
117          player_t *p1;
118          s1 = g_array_index (g->players, int, i);
119          p1 = g_tree_lookup (config->sock_id, GINT_TO_POINTER (s1));
120          g_assert (p1 != NULL);
121          send_ask_bids (s1, p1, 1);
122        }
123      g->state = GAME_STATE_CHECKING_BIDS;
124    }
125    
126    void
127    chien_managment (game_t * g)
128    {
129      /* Some code was written the day after my Grand'ma died.
130       * I dedicate that code to her.
131       * I, her and my Grand'pa spent hours and hours playing Tarot
132       * Please do not remove this comment
133       * Yves (June 6th 2003)
134       */
135      if ((LIBMT_BID_CMP (g->rules->bid, LIBMT_BID_PRISE))
136          && (LIBMT_BID_CMP (g->rules->bid, LIBMT_BID_GARDE)))
137        {
138          g->state = GAME_STATE_PLAYING_GAME;
139        }
140      else
141        {
142          int s1;
143          player_t *p1;
144          int nb = 0;
145          int pos;
146          int i;
147          for (i = 0; i < g->players->len; i++)
148            {
149              s1 = g_array_index (g->players, int, i);
150              p1 = g_tree_lookup (config->sock_id, GINT_TO_POINTER (s1));
151              g_assert (p1 != NULL);
152              send_info_chien (s1, p1);
153            }
154          s1 = g_array_index (g->players, int, g->rules->preneur);
155          p1 = g_tree_lookup (config->sock_id, GINT_TO_POINTER (s1));
156          g_assert (p1 != NULL);
157          if (g->nb_players_max == 3)
158            nb = 6;
159          else if (g->nb_players_max == 4)
160            nb = 6;
161          else if (g->nb_players_max == 5)
162            nb = 3;
163          g_assert (nb != 0);
164          pos = player_get_position (p1);
165          for (i = 0; i < nb; i++)
166            {
167              g->rules->card_status[g->rules->chien[i]] = pos;
168            }
169          send_ask_chien (s1, p1);
170          g->state = GAME_STATE_ASKING_CHIEN;
171        }
172    }
173    
174    void
175    play_game (game_t * g)
176    {
177    
178    }
179    
180  gboolean  gboolean
181  game_state_machine_cb (gpointer a, gpointer b, gpointer c)  game_state_machine_cb (gpointer a, gpointer b, gpointer c)
182  {  {
# Line 51  game_state_machine_cb (gpointer a, gpoin Line 187  game_state_machine_cb (gpointer a, gpoin
187        if (g->nb_players == g->nb_players_max)        if (g->nb_players == g->nb_players_max)
188          {          {
189            printf ("starting\n");            printf ("starting\n");
190            for (i = 0; i < g->players->len; i++)            state_change (g, PLAYER_STATE_START_GAME, GAME_STATE_START_GAME);
             {  
               int sock_id = g_array_index (g->players, int, i);  
               player_t *p =  
                 g_tree_lookup (config->sock_id, GINT_TO_POINTER (sock_id));  
               g_assert (p != NULL);  
               p->state = PLAYER_STATE_START_GAME;  
               p->state_change_date = 0;  
             }  
           g->state = GAME_STATE_START_GAME;  
191          }          }
192      }      }
193    else if (g->state == GAME_STATE_START_GAME)    else if (g->state == GAME_STATE_START_GAME)
194      {      {
       player_t *p;  
195        game_start (g);        game_start (g);
196        for (i = 0; i < g->players->len; i++)        say_resume_and_send_cards_in_hand (g);
         {  
           int sock_id = g_array_index (g->players, int, i);  
           p = g_tree_lookup (config->sock_id, GINT_TO_POINTER (sock_id));  
           g_assert (p != NULL);  
           send_message_SAY_resume (sock_id, g);  
           send_message_SAY_cards_in_hand (sock_id, g, i);  
           g->rules->bids[i] = LIBMT_BID_UNDEF;  
         }  
197        g->turn = g->game_turn;        g->turn = g->game_turn;
198        g->state = GAME_STATE_ASKING_BIDS;        g->state = GAME_STATE_ASKING_BIDS;
199      }      }
# Line 87  game_state_machine_cb (gpointer a, gpoin Line 205  game_state_machine_cb (gpointer a, gpoin
205        g_assert (p != NULL);        g_assert (p != NULL);
206        if (p->state != PLAYER_STATE_ASKING_BID)        if (p->state != PLAYER_STATE_ASKING_BID)
207          {          {
208            int turn = g->turn;            if (!find_out_who_has_to_bid_and_ask_him (g))
           for (i = 0; i < g->nb_players_max; i++)  
209              {              {
210                int s1;                send_ask_bids_to_all (g);
               player_t *p1;  
               turn++;  
               if (turn >= g->nb_players_max)  
                 turn = 0;  
   
               s1 = g_array_index (g->players, int, turn);  
               p1 = g_tree_lookup (config->sock_id, GINT_TO_POINTER (s1));  
               g_assert (p1 != NULL);  
               if ((g->rules->bids[turn] == LIBMT_BID_UNDEF)  
                   ||  
                   ((LIBMT_BID_CMP (g->rules->bids[turn], LIBMT_BID_PASSE)  
                     && LIBMT_BID_CMP (g->rules->bids[turn], g->rules->bid))))  
                 {  
                   p1->state = PLAYER_STATE_ASKING_BID;  
                   p1->state_change_date = 0;  
                   g->turn = turn;  
                   send_waiting_for_player (p1);  
                   break;  
   
                 }  
             }  
           if (i == g->nb_players_max)  
             {  
               for (i = 0; i < g->players->len; i++)  
                 {  
                   int s1;  
                   player_t *p1;  
                   s1 = g_array_index (g->players, int, i);  
                   p1 = g_tree_lookup (config->sock_id, GINT_TO_POINTER (s1));  
                   g_assert (p1 != NULL);  
                   send_ask_bids (s1, p1, 1);  
                 }  
               g->state = GAME_STATE_CHECKING_BIDS;  
211              }              }
212    
213          }          }
# Line 142  game_state_machine_cb (gpointer a, gpoin Line 226  game_state_machine_cb (gpointer a, gpoin
226      }      }
227    else if (g->state == GAME_STATE_NOT_PLAYING_GAME)    else if (g->state == GAME_STATE_NOT_PLAYING_GAME)
228      {      {
229          /* Do we restart the game here ? */
230      }      }
231    else if (g->state == GAME_STATE_CHIEN_MANAGMENT)    else if (g->state == GAME_STATE_CHIEN_MANAGMENT)
232      {      {
233        /* Some code was written the day after my Grand'ma died.        chien_managment (g);
        * I dedicate that code to her.  
        * I, her and my Grand'pa spent hours and hours playing Tarot  
        * Please do not remove this comment  
        * Yves (June 6th 2003)  
        */  
       if ((LIBMT_BID_CMP (g->rules->bid, LIBMT_BID_PRISE))  
           && (LIBMT_BID_CMP (g->rules->bid, LIBMT_BID_GARDE)))  
         {  
           g->state = GAME_STATE_PLAYING_GAME;  
         }  
       else  
         {  
           int s1;  
           player_t *p1;  
           int nb = 0;  
           int pos;  
           for (i = 0; i < g->players->len; i++)  
             {  
               s1 = g_array_index (g->players, int, i);  
               p1 = g_tree_lookup (config->sock_id, GINT_TO_POINTER (s1));  
               g_assert (p1 != NULL);  
               send_info_chien (s1, p1);  
             }  
           s1 = g_array_index (g->players, int, g->rules->preneur);  
           p1 = g_tree_lookup (config->sock_id, GINT_TO_POINTER (s1));  
           g_assert (p1 != NULL);  
           if (g->nb_players_max == 3)  
             nb = 6;  
           else if (g->nb_players_max == 4)  
             nb = 6;  
           else if (g->nb_players_max == 5)  
             nb = 3;  
           g_assert (nb != 0);  
           pos = player_get_position (p1);  
           for (i = 0; i < nb; i++)  
             {  
               g->rules->card_status[g->rules->chien[i]] = pos;  
             }  
           send_ask_chien (s1, p1);  
           g->state = GAME_STATE_ASKING_CHIEN;  
         }  
234      }      }
235    else if (g->state == GAME_STATE_ASKING_CHIEN)    else if (g->state == GAME_STATE_ASKING_CHIEN)
236      {      {
# Line 198  game_state_machine_cb (gpointer a, gpoin Line 242  game_state_machine_cb (gpointer a, gpoin
242      }      }
243    else if (g->state == GAME_STATE_PLAYING_GAME)    else if (g->state == GAME_STATE_PLAYING_GAME)
244      {      {
245          play_game (g);
246      }      }
247    return (FALSE);    return (FALSE);
248  }  }

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

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