Advertisement
Guest User

Untitled

a guest
Aug 31st, 2015
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. include("v4.Globals");
  2. //debug(getAIName());
  3.  
  4. global _GPGridHeigth    = 36;
  5. global _GPGridWidth     = 36;
  6. global _GPGridDecalage  = 18;   // decalage pour que le _getPath soit en coords positives
  7.  
  8. global _GPValueEmptyCell    = 0;
  9. global _GPValueObstacle     = -1;
  10. global _GPValueOutOfBounds  = -1;
  11. global _GPValueTakenCells   = -1;
  12.  
  13. global _GPGrid_default;
  14. /**
  15. * _GPGrid_update renvoie une représentation de la carte en array par défaut
  16. * On le lance comme routine au premier tour
  17. */
  18. function _GPGrid_create(){
  19.     _GPGrid_default = [];
  20.     for(var y = _GPGridHeigth/2*-1;y<=_GPGridHeigth/2;y++){
  21.         _GPGrid_default[y+_GPGridDecalage] = [];
  22.         for(var x = _GPGridWidth/2*-1;x<=_GPGridWidth/2;x++){
  23.             if(_COORDSYXCELLS_[y][x]){
  24.                 var cell = _COORDSYXCELLS_[y][x];
  25.                 if(inArray(_CELLS_OBSTACLES_, cell)){
  26.                     _GPGrid_default[y+_GPGridDecalage][x+_GPGridDecalage] = _GPValueObstacle;
  27.                 }
  28.                 else{
  29.                     _GPGrid_default[y+_GPGridDecalage][x+_GPGridDecalage] = _GPValueEmptyCell;
  30.                 }
  31.             }else{
  32.                 _GPGrid_default[y+_GPGridDecalage][x+_GPGridDecalage] = _GPValueOutOfBounds;
  33.             }
  34.         }
  35.     }
  36. }
  37. if(getTurn() == 1){ _GPGrid_create();}
  38.  
  39. /**
  40. * getGridAdjacent
  41. * renvoie la grille des cellules disponibles
  42. * @cell             : la cell d'origine
  43. * @radius           : la portée ( MP )
  44. * @takenCells       : un array de cells interdites ( LeeksCells )
  45. * @returnByMoves    : bool renvoie un tableau avec les cases reachable/radius
  46. * @returnByArea     : bool renvoie un tableau avec toutes les cases reachable
  47. */
  48. global _GPGrid;
  49. function getGridAdjacent(cell, radius, takenCells, returnByMoves, returnByArea, returnByCells){
  50.     // on initialise les returns
  51.         var retour;
  52.         var returnMoves = [];
  53.         var returnArea = [];
  54.         var returnCells = [];
  55.     // la cellule d'origine
  56.         var initialCell_x = _CELLSCOORDS_[cell][0]+_GPGridDecalage;
  57.         var initialCell_y = _CELLSCOORDS_[cell][1]+_GPGridDecalage;
  58.     // on réinitialise la carte par défaut pour l'utiliser dans cet appel
  59.         _GPGrid = _GPGrid_default;
  60.     // on ajoute les cells à ignorer
  61.         if(count(takenCells) > 0){
  62.             var c;
  63.             var cx;
  64.             var cy;
  65.             for(c in takenCells){
  66.                 cx = _CELLSCOORDS_[c][0]+_GPGridDecalage;
  67.                 cy = _CELLSCOORDS_[c][1]+_GPGridDecalage;
  68.                 _GPGrid[cy][cx] = _GPValueTakenCells;
  69.             }
  70.         }
  71.     // la cell sur laquelle on se trouve
  72.         if(!inArray(takenCells, cell)){
  73.             if(returnByMoves){  returnMoves[0] = [cell];    }
  74.             if(returnByArea) {  push(returnArea, cell);     }
  75.             if(returnByCells){  returnCells[cell] = 0;      }
  76.         }
  77.        
  78.     if(radius > 0){
  79.         var k; var x; var y; var i; var j; var realCell;
  80.         var counting = _GPValueEmptyCell + 1;
  81.         var cellArray = findFreeCell(initialCell_x, initialCell_y, counting);
  82.         // premier mouvement, initialisation de la boucle
  83.             for(k in cellArray){
  84.                 y = k[1];
  85.                 x = k[0];
  86.                 realCell = _GPGetRealCellFromXY(x,y);
  87.                 if(realCell){
  88.                     if(returnByMoves)   {   if(!returnMoves[1]){returnMoves[1] = [];    }
  89.                                             push(returnMoves[1], realCell);             }
  90.                     if(returnByArea)    {   push(returnArea, realCell);                 }
  91.                     if(returnByCells)   {   returnCells[cell] = 1;                      }
  92.                 }
  93.             }
  94.         // mouvements suivants
  95.             for(i=1;i<radius;i++){
  96.                 cellArray = findTheEnd(cellArray, counting+i);
  97.                     for(j in cellArray){
  98.                         y = j[1];
  99.                         x = j[0];
  100.                         realCell = _GPGetRealCellFromXY(x,y);
  101.                         if(realCell){
  102.                             if(returnByMoves)   {   if(!returnMoves[i+1]){returnMoves[i+1] = [];    }
  103.                                                     push(returnMoves[i+1], realCell);               }
  104.                             if(returnByArea)    {   push(returnArea, realCell);                     }
  105.                             if(returnByCells)   {   returnCells[realCell] = i+1;                    }
  106.                         }
  107.                     }
  108.             }
  109.     }
  110.  
  111.          if (returnByMoves && !returnByArea && !returnByCells)  {   retour = returnMoves;   }
  112.     else if (!returnByMoves && returnByArea && !returnByCells)  {   retour = returnArea;    }
  113.     else if (!returnByMoves && !returnByArea && returnByCells)  {   retour = returnCells;   }
  114.     else    {   retour = [["moves":returnMoves],["area":returnArea],["cells":returnCells]]; }
  115.  
  116.     if(false && returnByMoves){
  117.         var nbMoves;
  118.         var arrayMove;
  119.         var c;
  120.         for(nbMoves:arrayMove in returnMoves){
  121.             for(c in arrayMove){
  122.                 mark(c, COLOR_GREEN*((nbMoves/(arrayMax(returnCells)+1))*256));
  123.         }   }   pause();
  124.     }
  125.     if(false && returnCells){
  126.         var nbMoves;
  127.         var arrayMove;
  128.         var c;
  129.         for(c:nbMoves in returnCells){
  130.             mark(c, COLOR_GREEN*nbMoves/(arrayMax(returnCells)+1));
  131.         }   pause();
  132.     }
  133.    
  134. return retour;
  135. }
  136.    
  137. function _GPGetRealCellFromXY(x,y){
  138.     return _COORDSYXCELLS_[y-_GPGridDecalage][x-_GPGridDecalage];
  139. }  
  140.  
  141. /**
  142. * trouve les cases voisines qui sont libres
  143. * @posX    position en x sur la grille
  144. * @posY    position en y sur la grille
  145. * @pNumber valeur que von prendre les cases libres
  146. * @return  tableau des cases libre trouvé
  147. */
  148.     function findFreeCell(posX, posY, pNumber) {
  149.         var arrayWay = [];
  150.         var number = pNumber || _GPValueEmptyCell;
  151.         _GPGrid[posY][posX] = pNumber;
  152.  
  153.             for (var i = count(GPAdjacentCells) - 1; i >= 0; i--) {
  154.                 if (GPAdjacentCells[i](posY, posX, false) === _GPValueEmptyCell) {
  155.                     var adjC = GPAdjacentCells[i](posY, posX, true);
  156.                     _GPGrid[adjC[1]][adjC[0]] = pNumber + 1;
  157.                     push(arrayWay, adjC);
  158.                 }
  159.             };            
  160.  
  161.         if (count(arrayWay) === 0) return false;
  162.         else return arrayWay;
  163.     }
  164.    
  165.    
  166. /**
  167. * Appelle la fonction findFreeCell, pour chaque case que trouve cette fonction
  168. * @pArray tableau de cells libres
  169. * @pCount valeur que vont prendre les cases qui seront trouvées
  170. * @return tableau des cases libres trouvées
  171. */
  172.     function findTheEnd(pArray, pCount) {
  173.         var lcount = pCount + 1;
  174.         var nextCellArray = [];
  175.         for (var i = count(pArray) - 1; i >= 0; i--) {
  176.  
  177.             var lArray = findFreeCell(pArray[i][0], pArray[i][1], pCount);
  178.             if (lArray != false) {
  179.                 for (var j = count(lArray) - 1; j >= 0; j--) {
  180.                     push(nextCellArray, [lArray[j][0], lArray[j][1]]);
  181.                 }
  182.             } else continue;
  183.         }
  184.         return nextCellArray;
  185.     };
  186.  
  187. /**
  188. * recupère la valeur de la case de gauche de la case cible
  189. * @pY     position en Y de la case ciblé]
  190. * @pX     position en X de la case ciblé]
  191. * @pArray si true renvoie la valeur un array de la position de la case
  192. * @return valeur de la case
  193. */
  194.     var leftCell = function(pY, pX, pArray) {
  195.        
  196.         pArray = pArray || false;
  197.         if (pArray) return [pX - 1, pY];
  198.         if (pX - 1 >= 0 && pX - 1 <= _GPGridWidth && pX > 0) {
  199.             return _GPGrid[pY][pX - 1];
  200.         } else return false;
  201.  
  202.     };
  203.  
  204. /**
  205. * recupère la valeur de la case de droite de la case cible
  206. * @pY     position en Y de la case ciblé]
  207. * @pX     position en X de la case ciblé]
  208. * @pArray si true renvoie la valeur un array de la position de la case
  209. * @return valeur de la case
  210. */
  211.     var rightCell = function(pY, pX, pArray) {
  212.         pArray = pArray || false;
  213.         if (pArray) return [pX + 1, pY];
  214.         if (pX + 1 >= 0 && pX + 1 <= _GPGridWidth && pX < _GPGridWidth - 1) {
  215.             return _GPGrid[pY][pX + 1];
  216.         } else return false;
  217.     };
  218.  
  219. /**
  220.  * recupère la valeur de la case en bas de la case cible
  221. * @pY     position en Y de la case ciblé]
  222. * @pX     position en X de la case ciblé]
  223. * @pArray si true renvoie la valeur un array de la position de la case
  224. * @return valeur de la case
  225. */
  226.     var downCell = function(pY, pX, pArray) {
  227.         pArray = pArray || false;
  228.         if (pArray) return [pX, pY + 1];
  229.         if (pY + 1 >= 0 && pY + 1 <= _GPGridHeigth && pY < _GPGridHeigth - 1) {
  230.             return _GPGrid[pY + 1][pX];
  231.         } else return false;
  232.     };
  233.  
  234. /**
  235.  * recupère la valeur de la case du haut de la case cible
  236. * @pY     position en Y de la case ciblé]
  237. * @pX     position en X de la case ciblé]
  238. * @pArray si true renvoie la valeur un array de la position de la case
  239. * @return valeur de la case
  240. */
  241.     var upCell = function(pY, pX, pArray) {
  242.         pArray = pArray || false;
  243.         if (pArray) return [pX, pY - 1];
  244.         if (pY - 1 >= 0 && pY - 1 <= _GPGridHeigth && pY > 0) {
  245.             return _GPGrid[pY - 1][pX];
  246.         } else return false;
  247.     };
  248. global GPAdjacentCells = [leftCell, rightCell, downCell, upCell];
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement