Advertisement
lucasgautheron

Untitled

Jun 1st, 2011
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. struct servermap
  2. {
  3.     const char *name;
  4.     int minplayers, maxplayers, bestplayers;
  5.     vector<int *>modes;
  6.     int lastplayedmillis;
  7.     int lastmodesmillis[GMODE_NUM];
  8.     int bestmode; // auto generated;
  9.    
  10.     servermap() : name(""), minplayers(0), maxplayers(0), bestplayers(0), lastplayedmillis(0), bestmode(-1)
  11.     {
  12.         loopi(GMODE_NUM) { modes[i] = 0; lastmodesmillis[i] = 0; }
  13.     }
  14. };
  15.  
  16. vector<servermap *>servermaps;
  17.  
  18. void smap_add(const char *map, ...)
  19. {
  20.     servermap smap;
  21.     smap.name = newstring(map);
  22.     servermaps.add(smap);
  23. }
  24.  
  25. void smap_update(const char *map, int gamemode)
  26. {
  27.     if(gamemode < 0 || gamemode >= GMODE_NUM) return;
  28.     loopv(servermaps) if(!strcmp(servermaps[i]->name, map))
  29.     {
  30.         servermaps[i]->lastmodesmillis[gamemode] = servermaps[i]->lastplayedmillis = servmillis;
  31.     }
  32. }
  33.  
  34. servermap *smap_best()
  35. {
  36.     int bestsmapscore = 0, servermap *bestsmap = NULL;
  37.     loopv(servermaps)
  38.     {
  39.         int smapscore = 0;
  40.         serversmap *smap = servermaps[i];
  41.         int players_count = numclients();
  42.         if(players_count < smap->minplayers || players_count > smap->maxplayers) continue; // too many / not enough players
  43.         if(!modes.length()) continue; // no game mode available
  44.        
  45.         smapscore += 100 - pow(abs(players_count-smap->bestplayers), 2); // diff = 0 : 100 pts, diff = 5 : 75 pts, diff = 10 : 0 pts and then minus points (max = 100 pts !)
  46.         smapscore += sqrt(servmillis - smap->lastplayedmillis) / 10; // 1 hour = 3600 sec = 189 points, 15 minutes = 94 points
  47.         smapscore += rnd(50);
  48.        
  49.         oldestmodemillis = 0;
  50.         loopv(modes) if(oldestmode < 0 || oldestmodemillis < smap->lastmodesmillis[modes[i]])
  51.         {
  52.             smap->bestmode = modes[i];
  53.             oldestmodemillis = smap->lastmodesmillis[modes[i]];
  54.         }
  55.        
  56.         if(!bestsmap || bestsmapscore <= smapscore)
  57.         {
  58.             bestsmapscore = smapscore;
  59.             bestmap = smap;
  60.         }
  61.     }
  62.    
  63.     return bestsmap;
  64. }
  65.  
  66. // format : mapname:minplayers:maxplayers:bestplayers:"list of modes num":
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement