load_map.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /* $Id: load_map.c,v 1.19 2001/04/29 17:35:16 kilobug Exp $ */
  2. #include "client.h"
  3. void get_object_param(int fd, obj_t *obj, conf_t *conf)
  4. {
  5. obj->posx = net_get_float(conf->socket);
  6. obj->posy = net_get_float(conf->socket);
  7. obj->team_id = net_get_int(conf->socket);
  8. if (obj->type == obj_akx)
  9. {
  10. obj->action = net_get_int(fd);
  11. switch (obj->action)
  12. {
  13. case act_akx_move:
  14. break;
  15. case act_akx_pulse:
  16. obj->angle = net_get_float(fd);
  17. obj->tx = net_get_float(fd);
  18. obj->ty = net_get_float(fd);
  19. break;
  20. case act_akx_link:
  21. obj->target = net_get_int(fd);
  22. break;
  23. default:
  24. protocol_error(conf, "invalid action");
  25. return;
  26. }
  27. }
  28. }
  29. static player_t *get_player(conf_t *conf)
  30. {
  31. player_t *res;
  32. if (!net_chk_string(conf->socket, "PLR"))
  33. {
  34. protocol_error(conf, "PLR exepected");
  35. return NULL;
  36. }
  37. res = g_malloc(sizeof(*res));
  38. res->id = net_get_int(conf->socket);
  39. if ((res->id > conf->map->nb_players) || (res->id < 1))
  40. {
  41. protocol_error(conf, "player id invalid");
  42. g_free(res);
  43. return NULL;
  44. }
  45. res->name = net_get_string(conf->socket);
  46. res->score = net_get_float(conf->socket);
  47. gen_colors(res->id, conf->map->nb_players + 1, res);
  48. res->akx = tint_picture(conf->akx, res->colors);
  49. res->r4d2 = tint_picture(conf->r4d2, res->colors);
  50. return res;
  51. }
  52. static gboolean get_players(conf_t *conf)
  53. {
  54. int i;
  55. player_t *player;
  56. conf->map->players = g_malloc(sizeof(*(conf->map->players)) *
  57. (conf->map->nb_players + 1));
  58. for (i = 0; i < conf->map->nb_players; i++)
  59. conf->map->players[i + 1] = NULL;
  60. for (i = 0; i < conf->map->nb_players; i++)
  61. {
  62. player = get_player(conf);
  63. if (player == NULL)
  64. return FALSE;
  65. conf->map->players[player->id] = player;
  66. }
  67. net_send_ack(conf->file);
  68. conf->map->players[0] = g_malloc(sizeof (*conf->map->players[0]));
  69. conf->map->players[0]->id = 0;
  70. conf->map->players[0]->name = "Sauvage";
  71. conf->map->players[0]->score = 0.0;
  72. conf->map->players[0]->akx = load_picture("akx_0.xpm",
  73. "akx_0_mask.xpm");
  74. conf->map->players[0]->r4d2 = load_picture("r4d2_0.xpm",
  75. "r4d2_0_mask.xpm");
  76. gen_colors(0, conf->map->nb_players + 1, conf->map->players[0]);
  77. player_list_make(conf);
  78. stats_make(conf);
  79. return TRUE;
  80. }
  81. static obj_t *get_object(conf_t *conf)
  82. {
  83. obj_t *res;
  84. if (!net_chk_string(conf->socket, "OBJ"))
  85. {
  86. protocol_error(conf, "OBJ expected");
  87. return NULL;
  88. }
  89. res = g_malloc(sizeof(*res));
  90. res->changed = TRUE;
  91. res->id = net_get_int(conf->socket);
  92. if ((res->id >= conf->map->nb_objects) || (res->id < 0))
  93. {
  94. protocol_error(conf, "object id invalid");
  95. g_free(res);
  96. return NULL;
  97. }
  98. res->type = net_get_int(conf->socket);
  99. if ((res->type != obj_r4d2) && (res->type != obj_akx))
  100. {
  101. protocol_error(conf, "object type invalid");
  102. g_free(res);
  103. return NULL;
  104. }
  105. get_object_param(conf->socket, res, conf);
  106. return res;
  107. }
  108. static gboolean get_objects(conf_t *conf)
  109. {
  110. int i;
  111. obj_t *obj;
  112. conf->map->objects = g_malloc(sizeof(*(conf->map->objects)) *
  113. conf->map->nb_objects);
  114. for (i = 0; i < conf->map->nb_objects; i++)
  115. conf->map->objects[i] = NULL;
  116. for (i = 0; i < conf->map->nb_objects; i++)
  117. {
  118. obj = get_object(conf);
  119. if (obj == NULL)
  120. return FALSE;
  121. conf->map->objects[obj->id] = obj;
  122. }
  123. net_send_ack(conf->file);
  124. return TRUE;
  125. }
  126. void load_map(conf_t *conf)
  127. {
  128. map_t *map;
  129. conf->ready = FALSE;
  130. destroy_map(conf);
  131. map = g_malloc(sizeof(*map));
  132. conf->map = map;
  133. map->sizex = net_get_float(conf->socket);
  134. map->sizey = net_get_float(conf->socket);
  135. map->nb_turns = net_get_int(conf->socket);
  136. map->turn_num = net_get_int(conf->socket);
  137. map->nb_players = net_get_int(conf->socket);
  138. map->nb_r4d2 = net_get_int(conf->socket);
  139. map->nb_akx = net_get_int(conf->socket);
  140. map->sand_file = net_get_string(conf->socket);
  141. if (map->sand_file[0] == 0)
  142. map->background = NULL;
  143. else
  144. map->background = load_picture(map->sand_file, NULL);
  145. map->nb_objects = map->nb_r4d2 + map->nb_akx;
  146. map->players = NULL;
  147. map->objects = NULL;
  148. net_send_ack(conf->file);
  149. if (!get_players(conf))
  150. {
  151. destroy_map(conf);
  152. return;
  153. }
  154. if (!get_objects(conf))
  155. {
  156. destroy_map(conf);
  157. return;
  158. }
  159. conf->ready = TRUE;
  160. scroll_bigmap(conf, -4242, -4242);
  161. stats_make(conf);
  162. }