anongame_maplists.c
上传用户:tany51
上传日期:2013-06-12
资源大小:1397k
文件大小:9k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* 
  2.  * This program is free software; you can redistribute it and/or
  3.  * modify it under the terms of the GNU General Public License
  4.  * as published by the Free Software Foundation; either version 2
  5.  * of the License, or (at your option) any later version.
  6.  *
  7.  * This program is distributed in the hope that it will be useful,
  8.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.  * GNU General Public License for more details.
  11.  *
  12.  * You should have received a copy of the GNU General Public License
  13.  * along with this program; if not, write to the Free Software
  14.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  15.  */
  16. #include "common/setup_before.h"
  17. #include <stdio.h>
  18. /* amadeo */
  19. #ifdef WIN32_GUI
  20. #include <win32/winmain.h>
  21. #endif
  22. #ifdef HAVE_STRING_H
  23. # include <string.h>
  24. #else
  25. # ifdef HAVE_STRINGS_H
  26. #  include <strings.h>
  27. # endif
  28. #endif
  29. #include "common/packet.h"
  30. #include "common/tag.h"
  31. #include "common/eventlog.h"
  32. #include "prefs.h"
  33. #include "anongame_maplists.h"
  34. #include "common/setup_after.h"
  35. #define MAXMAPS 100
  36. #define MAXMAPS_PER_QUEUE 32 /* cannot be changed (map_prefs only supports 32 maps) */
  37. /**********************************************************************************/
  38. static char * maplist_war3[MAXMAPS];
  39. static char * maplist_w3xp[MAXMAPS];
  40. static int number_maps_war3 = 0;
  41. static int number_maps_w3xp = 0;
  42. static char maplists_war3[ANONGAME_TYPES][MAXMAPS_PER_QUEUE+1];
  43. static char maplists_w3xp[ANONGAME_TYPES][MAXMAPS_PER_QUEUE+1];
  44. static int _maplists_type_get_queue(const char * type);
  45. static char * _maplists_queue_get_type(int queue);
  46. static void _maplists_add_map(char const * clienttag, char * mapname, int queue);
  47. /*****/
  48. static char * queue_names[ANONGAME_TYPES] = {
  49. "1v1","2v2","3v3","4v4","sffa","at2v2","tffa","at3v3","at4v4",
  50. "TY",
  51. "5v5","6v6","2v2v2","3v3v3","4v4v4","2v2v2v2","3v3v3v3",
  52. "at2v2v2"
  53.     };
  54. /**********************************************************************************/
  55. static int _maplists_type_get_queue(const char * type)
  56. {
  57.     int i;
  58.     
  59.     for (i = 0; i < ANONGAME_TYPES; i++)
  60. if (strcmp(type, queue_names[i]) == 0)
  61.     return i;
  62.     return -1;
  63. }
  64. static char * _maplists_queue_get_type(int queue)
  65. {
  66.     return queue_names[queue];
  67. }
  68. static void _maplists_add_map(char const * clienttag, char * mapname, int queue)
  69. {
  70.         /* this function does two things
  71.  * 1. adds the mapname to maplist for MAPS section
  72.  * maplist[mapnumber] = mapname
  73.  * number_maps = total maps held in maplist[]
  74.  * 2. adds the mapnumber to maplists for TYPE section
  75.  * maplists[queue][0] = number of maps for queue
  76.  * maplists[queue][1..32] = mapnumber
  77.  * ie. maplist[maplists[queue][1..32]] = mapname
  78.  */
  79.     int in_list = 0;
  80.     int j;
  81.     if (strcmp(clienttag, CLIENTTAG_WARCRAFT3) == 0) {
  82. for (j = 0; j < number_maps_war3; j++) {
  83.     if (strcmp(maplist_war3[j], mapname) == 0) { /* already in list */
  84. in_list = 1;
  85. break;
  86.     }
  87. }
  88. if (!in_list)
  89.     maplist_war3[number_maps_war3++] = strdup(mapname);
  90. if (maplists_war3[queue][0] < MAXMAPS_PER_QUEUE) {
  91.     maplists_war3[queue][0]++;
  92.     maplists_war3[queue][(int)maplists_war3[queue][0]] = j;
  93. } else {
  94.     eventlog(eventlog_level_error,__FUNCTION__,
  95. "cannot add map "%s" for gametype: %s (maxmaps per qametype: %d)",
  96. mapname, _maplists_queue_get_type(queue), MAXMAPS_PER_QUEUE);
  97. }
  98.     }
  99.     
  100.     else if (strcmp(clienttag, CLIENTTAG_WAR3XP) == 0) {
  101. for (j = 0; j < number_maps_w3xp; j++) {
  102.     if (strcmp(maplist_w3xp[j], mapname) == 0) { /* already in list */
  103. in_list = 1;
  104. break;
  105.     }
  106. }
  107. if (!in_list)
  108.     maplist_w3xp[number_maps_w3xp++] = strdup(mapname);
  109. if (maplists_w3xp[queue][0] < MAXMAPS_PER_QUEUE) {
  110.     maplists_w3xp[queue][0]++;
  111.     maplists_w3xp[queue][(int)maplists_w3xp[queue][0]] = j;
  112. } else {
  113.     eventlog(eventlog_level_error,__FUNCTION__,
  114. "cannot add map "%s" for gametype: %s (maxmaps per qametype: %d)",
  115. mapname, _maplists_queue_get_type(queue), MAXMAPS_PER_QUEUE);
  116. }
  117.     }
  118.     else eventlog(eventlog_level_error,__FUNCTION__,"invalid clienttag: %s",clienttag);
  119. }
  120. /**********************************************************************************/
  121. extern int anongame_maplists_create(void)
  122. {
  123.    FILE *mapfd;
  124.    char buffer[256];
  125.    int len, i, queue;
  126.    char *p, *q, *r, *u;
  127.    if (prefs_get_mapsfile() == NULL) {
  128.       eventlog(eventlog_level_error, "anongame_maplists_create","invalid mapsfile, check your config");
  129.       return -1;
  130.    }
  131.    
  132.    if ((mapfd = fopen(prefs_get_mapsfile(), "rt")) == NULL) {
  133.       eventlog(eventlog_level_error, "anongame_maplists_create", "could not open mapsfile : "%s"", prefs_get_mapsfile());
  134.       return -1;
  135.    }
  136.    
  137.    /* init the maps, they say static vars are 0-ed anyway but u never know :) */
  138.    for(i=0; i < ANONGAME_TYPES; i++) {
  139.       maplists_war3[i][0] = 0;
  140.       maplists_w3xp[i][0] = 0;
  141.    }
  142.    
  143.    while(fgets(buffer, 256, mapfd)) {
  144.       len = strlen(buffer);
  145.       if (len < 1) continue;
  146.       if (buffer[len-1] == 'n') {
  147.  buffer[len-1] = '';
  148.       }
  149.       
  150.       /* search for comments and comment them out */
  151.       for(p = buffer; *p ; p++) 
  152. if (*p == '#') {
  153.    *p = '';
  154.    break;
  155. }
  156.       
  157.       /* skip spaces and/or tabs */
  158.       for(p = buffer; *p && ( *p == ' ' || *p == 't' ); p++); /* p = clienttag */
  159.       if (*p == '') continue;
  160.       
  161.       /* find next delimiter */
  162.       for(q = p; *q && *q != ' ' && *q != 't'; q++);
  163.       if (*q == '') continue;
  164.       
  165.       *q = ''; /* end of clienttag */
  166.       
  167.       /* skip spaces and/or tabs */
  168.       for (q++ ; *q && ( *q == ' ' || *q == 't'); q++); /* q = type */
  169.       if (*q == '') continue;
  170.       
  171.       /* find next delimiter */
  172.       for (r = q+1; *r && *r != ' ' && *r != 't'; r++);
  173.       
  174.       *r = ''; /* end of type */
  175.       
  176.       /* skip spaces and/or tabs */
  177.       for (r++ ; *r && ( *r == ' ' || *r == 't'); r++); /* r = mapname */
  178.       if (*r == '') continue;
  179.       
  180.       if (*r!='"') /* mapname without quotes */
  181.       /* find next delimiter */
  182.         for (u = r+1; *u && *u != ' ' && *u != 't'; u++);
  183.       else /* mapname with quotes */
  184. {
  185.   r++; /* skip quote */
  186.           for (u = r+1; *u && *u != '"'; u++); /* find end quote or end of buffer */
  187.   if (*u!='"')
  188.   {
  189.     eventlog(eventlog_level_error,__FUNCTION__,"missing " at the end of the map name, presume it's ok anyway");
  190.   }
  191. }
  192.       *u = ''; /* end of mapname */
  193.       
  194.       if ((queue = _maplists_type_get_queue(q)) < 0) continue; /* invalid queue */
  195.       _maplists_add_map(p, r, queue);
  196.    }
  197.    fclose(mapfd);
  198.    return 0;
  199. }
  200. /* used by the MAPS section */
  201. extern int maplists_get_totalmaps(char const * clienttag)
  202. {
  203.     if (strcmp(clienttag, CLIENTTAG_WARCRAFT3) == 0)
  204. return number_maps_war3;
  205.     
  206.     if (strcmp(clienttag, CLIENTTAG_WAR3XP) == 0)
  207.         return number_maps_w3xp;
  208.     
  209.     return 0;
  210. }
  211. extern void maplists_add_maps_to_packet(t_packet * packet, char const * clienttag)
  212. {
  213.     int i;
  214.     
  215.     if (strcmp(clienttag, CLIENTTAG_WARCRAFT3) == 0)
  216. for (i = 0; i < number_maps_war3; i++)
  217.     packet_append_string(packet, maplist_war3[i]);
  218.     if (strcmp(clienttag, CLIENTTAG_WAR3XP) == 0)
  219. for (i = 0; i < number_maps_w3xp; i++)
  220.     packet_append_string(packet, maplist_w3xp[i]);
  221. }
  222. /* used by TYPE section */
  223. extern int maplists_get_totalmaps_by_queue(char const * clienttag, int queue)
  224. {
  225.     if (strcmp(clienttag, CLIENTTAG_WARCRAFT3) == 0)
  226. return maplists_war3[queue][0];
  227.     
  228.     if (strcmp(clienttag, CLIENTTAG_WAR3XP) == 0)
  229. return maplists_w3xp[queue][0];
  230.     
  231.     return 0;
  232. }
  233.     
  234. extern void maplists_add_map_info_to_packet(t_packet * rpacket, char const * clienttag, int queue)
  235. {
  236.     int i;
  237.     
  238.     if (strcmp(clienttag, CLIENTTAG_WARCRAFT3) == 0) {
  239. for (i = 0; i < maplists_war3[queue][0] + 1; i++)
  240.     packet_append_data(rpacket, &maplists_war3[queue][i], 1);
  241.     }
  242.     if (strcmp(clienttag, CLIENTTAG_WAR3XP) == 0) {
  243. for (i = 0; i < maplists_w3xp[queue][0] + 1; i++)
  244.     packet_append_data(rpacket, &maplists_w3xp[queue][i], 1);
  245.     }
  246. }
  247. /* used by _get_map_from_prefs() */
  248. extern char * maplists_get_map(int queue, char const * clienttag, int mapnumber)
  249. {
  250.     if (strcmp(clienttag, CLIENTTAG_WARCRAFT3) == 0)
  251. return maplist_war3[(int)maplists_war3[queue][mapnumber]];
  252.     if (strcmp(clienttag, CLIENTTAG_WAR3XP) == 0)
  253. return maplist_w3xp[(int)maplists_w3xp[queue][mapnumber]];
  254.     
  255.     return NULL;
  256. }
  257. extern void anongame_maplists_destroy()
  258. {
  259.     int i;
  260.    
  261.     for (i = 0; i < MAXMAPS; i++) {
  262. if (maplist_war3[i])
  263.     free((void *)maplist_war3[i]);
  264. if (maplist_w3xp[i])
  265.     free((void *)maplist_w3xp[i]);
  266.     }
  267. }
  268. extern int anongame_add_tournament_map(char const * clienttag, char * mapname)
  269. {
  270.     _maplists_add_map(clienttag, mapname, ANONGAME_TYPE_TY);
  271.     return 0;
  272. }
  273. extern void anongame_tournament_maplists_destroy(void)
  274. {
  275.     return; /* nothing to destroy */
  276. }