stats.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. /* $Id: stats.c,v 1.11 2001/05/06 01:23:05 kilobug Exp $ */
  2. #include "client.h"
  3. #define STAT_BUF_SIZE 42
  4. /* Calcul des infos */
  5. static int stat_count_objects(conf_t *conf, int id, obj_type_t type)
  6. {
  7. int i, r;
  8. if ((type == obj_r4d2) && (id == 0))
  9. return 0;
  10. r = 0;
  11. for (i = 0; i < conf->map->nb_objects; i++)
  12. if ((conf->map->objects[i]->type == type) &&
  13. (conf->map->objects[i]->team_id == id))
  14. r++;
  15. return r;
  16. }
  17. static void stat_make_buf_r4d2(obj_t *obj, char **tb)
  18. {
  19. g_snprintf(tb[0], STAT_BUF_SIZE, "%d", obj->team_id);
  20. g_snprintf(tb[1], STAT_BUF_SIZE, "%.2f", obj->posx);
  21. g_snprintf(tb[2], STAT_BUF_SIZE, "%.2f", obj->posy);
  22. }
  23. static void stat_make_buf_akx(obj_t *obj, char **tb)
  24. {
  25. g_snprintf(tb[0], STAT_BUF_SIZE, "%d", obj->team_id);
  26. g_snprintf(tb[1], STAT_BUF_SIZE, "%.2f", obj->posx);
  27. g_snprintf(tb[2], STAT_BUF_SIZE, "%.2f", obj->posy);
  28. switch (obj->action)
  29. {
  30. case act_akx_move:
  31. g_snprintf(tb[3], STAT_BUF_SIZE, "%s", "Déplacement");
  32. g_snprintf(tb[4], STAT_BUF_SIZE, "(%.2f ; %.2f)", obj->tx, obj->ty);
  33. break;
  34. case act_akx_pulse:
  35. g_snprintf(tb[3], STAT_BUF_SIZE, "%s", "Pulse");
  36. g_snprintf(tb[4], STAT_BUF_SIZE, "(%.2f ; %.2f)", obj->tx, obj->ty);
  37. break;
  38. case act_akx_link:
  39. g_snprintf(tb[3], STAT_BUF_SIZE, "%s", "Lien");
  40. g_snprintf(tb[4], STAT_BUF_SIZE, "%d", obj->target);
  41. break;
  42. default:
  43. g_snprintf(tb[3], STAT_BUF_SIZE, "%s", "Erreur");
  44. g_snprintf(tb[4], STAT_BUF_SIZE, "Aucune");
  45. break;
  46. }
  47. }
  48. static void stat_obj_color(GtkCList *clist, conf_t *conf, obj_t *obj, int j)
  49. {
  50. int i;
  51. i = obj->team_id;
  52. if (i > conf->map->nb_players)
  53. i = 0;
  54. gtk_clist_set_foreground(clist, j, conf->map->players[i]->gdkcol);
  55. }
  56. /* Remplissage des listes */
  57. static void stat_append_player(conf_t *conf, player_t *pl, char **tb)
  58. {
  59. char *s;
  60. int j;
  61. s = tb[1];
  62. g_snprintf(tb[0], STAT_BUF_SIZE, "%d", pl->id);
  63. tb[1] = pl->name;
  64. g_snprintf(tb[2], STAT_BUF_SIZE, "%d",
  65. stat_count_objects(conf, pl->id, obj_akx));
  66. g_snprintf(tb[3], STAT_BUF_SIZE, "%d",
  67. stat_count_objects(conf, pl->id, obj_r4d2));
  68. g_snprintf(tb[4], STAT_BUF_SIZE, "%.2f", pl->score);
  69. j = gtk_clist_append(GTK_CLIST(conf->stat.pl), tb);
  70. gtk_clist_set_row_data(GTK_CLIST(conf->stat.pl), j, pl);
  71. gtk_clist_set_foreground(GTK_CLIST(conf->stat.pl), j, pl->gdkcol);
  72. tb[1] = s;
  73. }
  74. static void stat_append_r4d2(conf_t *conf, obj_t *obj, char **tb)
  75. {
  76. int j;
  77. g_snprintf(tb[0], STAT_BUF_SIZE, "%d", obj->id);
  78. stat_make_buf_r4d2(obj, tb + 1);
  79. j = gtk_clist_append(GTK_CLIST(conf->stat.r4d2), tb);
  80. gtk_clist_set_row_data(GTK_CLIST(conf->stat.r4d2), j, obj);
  81. stat_obj_color(GTK_CLIST(conf->stat.r4d2), conf, obj, j);
  82. }
  83. static void stat_append_akx(conf_t *conf, obj_t *obj, char **tb)
  84. {
  85. int j;
  86. g_snprintf(tb[0], STAT_BUF_SIZE, "%d", obj->id);
  87. stat_make_buf_akx(obj, tb + 1);
  88. j = gtk_clist_append(GTK_CLIST(conf->stat.akx), tb);
  89. gtk_clist_set_row_data(GTK_CLIST(conf->stat.akx), j, obj);
  90. stat_obj_color(GTK_CLIST(conf->stat.akx), conf, obj, j);
  91. }
  92. void stats_make(conf_t *conf)
  93. {
  94. char **tb;
  95. player_t *pl;
  96. int i;
  97. obj_t *obj;
  98. if (conf->map->players == NULL)
  99. return;
  100. if (conf->map->objects == NULL)
  101. return;
  102. tb = g_malloc(sizeof(*tb) * 6);
  103. for (i = 0; i < 6; i++)
  104. tb[i] = g_malloc(STAT_BUF_SIZE);
  105. gtk_clist_freeze(GTK_CLIST(conf->stat.pl));
  106. gtk_clist_clear(GTK_CLIST(conf->stat.pl));
  107. for (i = 0; i <= conf->map->nb_players; i++)
  108. {
  109. pl = conf->map->players[i];
  110. stat_append_player(conf, pl, tb);
  111. }
  112. gtk_clist_sort(GTK_CLIST(conf->stat.pl));
  113. gtk_clist_thaw(GTK_CLIST(conf->stat.pl));
  114. gtk_clist_freeze(GTK_CLIST(conf->stat.r4d2));
  115. gtk_clist_freeze(GTK_CLIST(conf->stat.akx));
  116. gtk_clist_clear(GTK_CLIST(conf->stat.r4d2));
  117. gtk_clist_clear(GTK_CLIST(conf->stat.akx));
  118. for (i = 0; i < conf->map->nb_objects; i++)
  119. {
  120. obj = conf->map->objects[i];
  121. if (obj == NULL)
  122. continue;
  123. if (obj->type == obj_akx)
  124. stat_append_akx(conf, obj, tb);
  125. else
  126. stat_append_r4d2(conf, obj, tb);
  127. }
  128. gtk_clist_sort(GTK_CLIST(conf->stat.r4d2));
  129. gtk_clist_sort(GTK_CLIST(conf->stat.akx));
  130. gtk_clist_thaw(GTK_CLIST(conf->stat.r4d2));
  131. gtk_clist_thaw(GTK_CLIST(conf->stat.akx));
  132. for (i = 0; i < 6; i++)
  133. g_free(tb[i]);
  134. g_free(tb);
  135. }
  136. /* Mise à jour des infos */
  137. static void stat_update_player(conf_t *conf, int i, char *tb)
  138. {
  139. player_t *pl;
  140. pl = gtk_clist_get_row_data(GTK_CLIST(conf->stat.pl), i);
  141. g_snprintf(tb, STAT_BUF_SIZE, "%d",
  142. stat_count_objects(conf, pl->id, obj_akx));
  143. gtk_clist_set_text(GTK_CLIST(conf->stat.pl), i, 2, tb);
  144. g_snprintf(tb, STAT_BUF_SIZE, "%d",
  145. stat_count_objects(conf, pl->id, obj_r4d2));
  146. gtk_clist_set_text(GTK_CLIST(conf->stat.pl), i, 3, tb);
  147. g_snprintf(tb, STAT_BUF_SIZE, "%.2f", pl->score);
  148. gtk_clist_set_text(GTK_CLIST(conf->stat.pl), i, 4, tb);
  149. }
  150. static void stat_update_akx(conf_t *conf, int i, char **tb)
  151. {
  152. obj_t *obj;
  153. int j;
  154. obj = gtk_clist_get_row_data(GTK_CLIST(conf->stat.akx), i);
  155. if (!obj->changed)
  156. return;
  157. stat_make_buf_akx(obj, tb);
  158. for (j = 0; j < 5; j++)
  159. gtk_clist_set_text(GTK_CLIST(conf->stat.akx), i, j + 1, tb[j]);
  160. stat_obj_color(GTK_CLIST(conf->stat.akx), conf, obj, i);
  161. }
  162. static void stat_update_r4d2(conf_t *conf, int i, char **tb)
  163. {
  164. obj_t *obj;
  165. int j;
  166. obj = gtk_clist_get_row_data(GTK_CLIST(conf->stat.r4d2), i);
  167. if (!obj->changed)
  168. return;
  169. stat_make_buf_r4d2(obj, tb);
  170. for (j = 0; j < 3; j++)
  171. gtk_clist_set_text(GTK_CLIST(conf->stat.r4d2), i, j + 1, tb[j]);
  172. stat_obj_color(GTK_CLIST(conf->stat.r4d2), conf, obj, i);
  173. }
  174. void stats_refresh(conf_t *conf)
  175. {
  176. int i;
  177. char **tb;
  178. if (conf->map->players == NULL)
  179. return;
  180. if (conf->map->objects == NULL)
  181. return;
  182. tb = g_malloc(sizeof(*tb) * 5);
  183. for (i = 0; i < 5; i++)
  184. tb[i] = g_malloc(STAT_BUF_SIZE);
  185. gtk_clist_freeze(GTK_CLIST(conf->stat.pl));
  186. for (i = 0; i <= conf->map->nb_players; i++)
  187. stat_update_player(conf, i, tb[0]);
  188. gtk_clist_sort(GTK_CLIST(conf->stat.pl));
  189. gtk_clist_thaw(GTK_CLIST(conf->stat.pl));
  190. gtk_clist_freeze(GTK_CLIST(conf->stat.akx));
  191. for (i = 0; i < conf->map->nb_akx; i++)
  192. stat_update_akx(conf, i, tb);
  193. gtk_clist_sort(GTK_CLIST(conf->stat.akx));
  194. gtk_clist_thaw(GTK_CLIST(conf->stat.akx));
  195. gtk_clist_freeze(GTK_CLIST(conf->stat.r4d2));
  196. for (i = 0; i < conf->map->nb_r4d2; i++)
  197. stat_update_r4d2(conf, i, tb);
  198. gtk_clist_sort(GTK_CLIST(conf->stat.r4d2));
  199. gtk_clist_thaw(GTK_CLIST(conf->stat.r4d2));
  200. for (i = 0; i < 5; i++)
  201. g_free(tb[i]);
  202. g_free(tb);
  203. }
  204. /* Création des widgets */
  205. static int players_sort(GtkCList *clist, gconstpointer p1, gconstpointer p2)
  206. {
  207. switch (clist->sort_column)
  208. {
  209. case 1:
  210. return clist_compare_str(clist, p1, p2);
  211. case 0: case 2: case 3: case 4:
  212. return clist_compare_float(clist, p1, p2);
  213. }
  214. return 0;
  215. }
  216. static int objects_sort(GtkCList *clist, gconstpointer p1, gconstpointer p2)
  217. {
  218. switch (clist->sort_column)
  219. {
  220. case 0: case 1: case 2: case 3:
  221. return clist_compare_float(clist, p1, p2);
  222. case 4: case 5:
  223. return clist_compare_str(clist, p1, p2);
  224. }
  225. return 0;
  226. }
  227. static void stat_hide(GtkWidget *w, conf_t *data)
  228. {
  229. gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(data->stat.menu), FALSE);
  230. }
  231. void create_stats(conf_t *conf)
  232. {
  233. GtkWidget *wind, *wid, *vbox, *frame, *scrolled;
  234. GtkAccelGroup *accel_group;
  235. wind = gtk_window_new(GTK_WINDOW_DIALOG);
  236. gtk_window_set_default_size(GTK_WINDOW(wind), 400, 600);
  237. gtk_widget_hide(wind);
  238. gtk_container_set_border_width(GTK_CONTAINER(wind), 7);
  239. gtk_window_set_title(GTK_WINDOW(wind), "Informations sur le jeu");
  240. conf->stat.stat = wind;
  241. vbox = gtk_vbox_new(FALSE, 4);
  242. gtk_widget_show(vbox);
  243. gtk_container_add(GTK_CONTAINER(wind), vbox);
  244. frame = create_frame("Joueurs");
  245. conf->stat.pl = create_clist(5, 4,
  246. "Equipe", "Nom", "Akx", "R4D2", "Score",
  247. 40, 100, 30, 30, 60,
  248. GTK_SORT_ASCENDING,
  249. GTK_SORT_ASCENDING,
  250. GTK_SORT_DESCENDING,
  251. GTK_SORT_DESCENDING,
  252. GTK_SORT_DESCENDING);
  253. scrolled = gtk_scrolled_window_new(NULL, NULL);
  254. gtk_widget_show(scrolled);
  255. gtk_container_add(GTK_CONTAINER(scrolled), conf->stat.pl);
  256. gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
  257. GTK_POLICY_AUTOMATIC,
  258. GTK_POLICY_AUTOMATIC);
  259. gtk_container_add(GTK_CONTAINER(frame), scrolled);
  260. gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 5);
  261. gtk_clist_set_compare_func(GTK_CLIST(conf->stat.pl), players_sort);
  262. gtk_clist_set_auto_sort(GTK_CLIST(conf->stat.pl), FALSE);
  263. clist_set_tooltips(GTK_CLIST(conf->stat.pl), conf->tooltips,
  264. "Trier par numéro d'équipe", "Trier par nom",
  265. "Trier par nombre d'anakronox",
  266. "Trier par nombre de r4d2", "Trier par score", NULL);
  267. frame = create_frame("Anakronox");
  268. conf->stat.akx = create_clist(6, 0,
  269. "Id", "Equipe", "X", "Y", "Action", "Cible",
  270. 20, 40, 40, 40, 50, 60,
  271. GTK_SORT_ASCENDING,
  272. GTK_SORT_ASCENDING,
  273. GTK_SORT_ASCENDING,
  274. GTK_SORT_ASCENDING,
  275. GTK_SORT_ASCENDING,
  276. GTK_SORT_ASCENDING);
  277. scrolled = gtk_scrolled_window_new(NULL, NULL);
  278. gtk_widget_show(scrolled);
  279. gtk_container_add(GTK_CONTAINER(scrolled), conf->stat.akx);
  280. gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
  281. GTK_POLICY_AUTOMATIC,
  282. GTK_POLICY_AUTOMATIC);
  283. gtk_container_add(GTK_CONTAINER(frame), scrolled);
  284. gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 5);
  285. gtk_clist_set_compare_func(GTK_CLIST(conf->stat.akx), objects_sort);
  286. gtk_clist_set_auto_sort(GTK_CLIST(conf->stat.akx), FALSE);
  287. clist_set_tooltips(GTK_CLIST(conf->stat.akx), conf->tooltips,
  288. "Trier par numéro", "Trier par équipe",
  289. "Trier par position X", "Trier par position Y",
  290. "Trier par action", "Trier par cible", NULL);
  291. frame = create_frame("R4D2");
  292. conf->stat.r4d2 = create_clist(4, 0,
  293. "Id", "Equipe", "X", "Y",
  294. 20, 40, 40, 40,
  295. GTK_SORT_ASCENDING,
  296. GTK_SORT_ASCENDING,
  297. GTK_SORT_ASCENDING,
  298. GTK_SORT_ASCENDING);
  299. scrolled = gtk_scrolled_window_new(NULL, NULL);
  300. gtk_widget_show(scrolled);
  301. gtk_container_add(GTK_CONTAINER(scrolled), conf->stat.r4d2);
  302. gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
  303. GTK_POLICY_AUTOMATIC,
  304. GTK_POLICY_AUTOMATIC);
  305. gtk_container_add(GTK_CONTAINER(frame), scrolled);
  306. gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 5);
  307. gtk_clist_set_compare_func(GTK_CLIST(conf->stat.r4d2), objects_sort);
  308. gtk_clist_set_auto_sort(GTK_CLIST(conf->stat.r4d2), FALSE);
  309. clist_set_tooltips(GTK_CLIST(conf->stat.r4d2), conf->tooltips,
  310. "Trier par numéro", "Trier par équipe",
  311. "Trier par position X", "Trier par position Y", NULL);
  312. accel_group = gtk_accel_group_new();
  313. gtk_window_add_accel_group(GTK_WINDOW(conf->stat.stat), accel_group);
  314. wid = gtk_button_new_with_label("Fermer");
  315. gtk_widget_add_accelerator(wid, "clicked", accel_group, GDK_Return, 0,
  316. GTK_ACCEL_VISIBLE);
  317. gtk_signal_connect_object(GTK_OBJECT(wind), "delete_event",
  318. GTK_SIGNAL_FUNC(gtk_button_clicked),
  319. GTK_OBJECT(wid));
  320. gtk_widget_show(wid);
  321. gtk_signal_connect(GTK_OBJECT(wid), "clicked",
  322. GTK_SIGNAL_FUNC(stat_hide), conf);
  323. gtk_box_pack_start(GTK_BOX(vbox), wid, FALSE, FALSE, 5);
  324. }