player.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <server.h>
  6. #include <general.h>
  7. #include <ipc.h>
  8. player_t *glbPlayer;
  9. static void *get_symbol(GModule *hdl, const char *name, boolean_t stop_error)
  10. {
  11. void *p = NULL;
  12. char *nm = strdup(name);
  13. if (!g_module_symbol(hdl, nm, &p))
  14. {
  15. nm[0] = toupper(nm[0]);
  16. if (!g_module_symbol(hdl, nm, &p) && stop_error)
  17. {
  18. fprintf(stderr, "Dynamic library error : %s : %s\n", name,
  19. g_module_error());
  20. return NULL;
  21. }
  22. }
  23. free(nm);
  24. return p;
  25. }
  26. player_t *player_new(const char *libname, const char *name, int id,
  27. conf_t *conf)
  28. {
  29. player_t *player;
  30. void (*caml)(char **);
  31. char *caml_par[2] = { "./server", NULL };
  32. printf("%s : %s ( %d )\n", name, libname, id);
  33. player = shm_alloc(sizeof(player_t), get_shm_plr_id() + id);
  34. if (!g_module_supported())
  35. {
  36. fprintf(stderr, "%s\n", "Fatal error : Dynamic library not supported!");
  37. server_abort();
  38. }
  39. player->team_id = id;
  40. player->name = name;
  41. player->score = 0;
  42. player->on = True;
  43. player->handle = g_module_open(libname, 0);
  44. player->time_turn = conf->turn_msec;
  45. if (player->handle == NULL)
  46. {
  47. fprintf(stderr, "Dynamic library error : %s : %s\n",
  48. libname, g_module_error());
  49. server_abort();
  50. }
  51. caml = get_symbol(player->handle, "caml_startup", False);
  52. if (caml)
  53. {
  54. caml(caml_par);
  55. }
  56. player->pipe_read = 0;
  57. player->pipe_write = 1;
  58. player->alive = False;
  59. player->init = get_symbol(player->handle, "player_init", True);
  60. player->new_turn = get_symbol(player->handle, "player_new_turn", True);
  61. player->turn_akx = get_symbol(player->handle, "player_akx_turn", True);
  62. player->turn_r4d2 = get_symbol(player->handle, "player_r4d2_turn", True);
  63. return player;
  64. }
  65. void player_destroy(player_t *player)
  66. {
  67. g_module_close(player->handle);
  68. free(player);
  69. }
  70. void player_init(player_t *p, int team_id)
  71. {
  72. if (p->init)
  73. {
  74. p->init(team_id, gl_config->nb_players);
  75. }
  76. else
  77. {
  78. printf("erreur de symbol : 'player_init'\n");
  79. }
  80. }
  81. void player_new_turn(player_t *p, int turn_num)
  82. {
  83. if (p->new_turn)
  84. {
  85. p->new_turn(turn_num);
  86. }
  87. else
  88. {
  89. printf("erreur de symbol : 'player_new_turn'\n");
  90. }
  91. }
  92. void player_turn_akx(player_t *p, int akx_id)
  93. {
  94. if (p->turn_akx)
  95. {
  96. p->turn_akx(akx_id);
  97. }
  98. else
  99. {
  100. printf("erreur de symbol : 'player_turn_akx'\n");
  101. }
  102. }
  103. void player_turn_r4d2(player_t *p, int r4d2_id)
  104. {
  105. if (p->turn_r4d2)
  106. {
  107. p->turn_r4d2(r4d2_id);
  108. }
  109. else
  110. {
  111. printf("erreur de symbol : 'player_turn_r4d2'\n");
  112. }
  113. }