124a125,131
> case_type typeCaseZone(int iGraphe, int iZone) {
>     if(iGraphe == MOI_GRAPHE)
>         return type_case(zones[iGraphe][iZone][0], moi());
>     else
>         return type_case(zones[iGraphe][iZone][0], adversaire());
> }
> 
181a189,209
> int nbCasesZone(int iGraphe, int iZone) {
>     return zones[iGraphe][iZone].size();
> }
> 
> int nbCasesVoisins(int iGraphe, int iZone) {
>     int ret = 0;
>     for(int iVoisin : voisins[iGraphe][iZone])
>         ret += nbCasesZone(iGraphe, iVoisin);
>     return ret;
> }
> 
> int nbCatalysesPlusGrosseZone(int iGraphe) {
>     vector<pair<int, int> > tailleEtId;
>     for(int iZone = 0; iZone < (int)zones[iGraphe].size(); iZone++) {
>         if(propriete_case_type(typeCaseZone(iGraphe, iZone)) == TRANSMUTABLE_OR)
>             tailleEtId.push_back(pair<int, int> (zones[iGraphe][iZone].size(), iZone));
>     }
>     sort(tailleEtId.begin(), tailleEtId.end(), greater<pair<int, int> > ());
>     return nbCasesVoisins(iGraphe, tailleEtId[0].second);
> }
> 
197c225,226
<     for(vector<position> zone : zones[MOI_GRAPHE]) {
---
>     for(int iZone = 0; iZone < (int)zones[MOI_GRAPHE].size(); iZone++) {
>         vector<position> &zone = zones[iZone][MOI_GRAPHE];
199c228
<         if(propriete_case(arbitraire, moi()) == TRANSMUTABLE_CATALYSEUR && zone.size() >= 4) {
---
>         if(propriete_case(arbitraire, moi()) == TRANSMUTABLE_CATALYSEUR && zone.size() >= 3 && nbCatalysesPlusGrosseZone(MOI_GRAPHE) >= quantite_transmutation_catalyseur(zone.size())) {
225c254,255
<         vector<pair<int, int>> nbParType(NB_TYPE_CASES, pair<int, int> (0,0));
---
>         /// Changement de stratégie planifié : si possible, un métal (pour essayer de m'en garantir un) et le métal vil le moins présent (oui !)
>         vector<pair<int, int>> nbParType(NB_TYPE_CASES, pair<int, int> (0,0)); /// La pair contient le type puis sa présence
227a258
> 
229d259
<         {
231d260
<             {
233,238d261
<             }
<         }
<         if(nbParType[typetoint(aPlacer.element1)].second < nbParType[typetoint(aPlacer.element2)].second)
<             aDonner.element1 = aPlacer.element1;
<         else
<             aDonner.element1 = aPlacer.element2;
240,243c263,290
<         sort(nbParType.begin(), nbParType.end(), compareTypePresence);
<         for(pair<int, int> typ : nbParType)
<         {
<             if(aDonner.element1 != inttotype(typ.first) && aDonner.element2 != inttotype(typ.first))
---
>         /// Ah oui, il y a la règle. 2 cas:
>         /// - Deux métaux de même propriété. Le cas est vite résolu : le moins présent chez l'adversaire, à égalité le plus présent chez nous.
>         /// - Un métal normal, un métal vil. On lui donne le métal normal pour nous en assurer un.
>         bool memePropriete = propriete_case_type(aPlacer.element1) == propriete_case_type(aPlacer.element2);
>         bool deuxVils = false;
>         if(memePropriete && propriete_case_type(aPlacer.element1) == TRANSMUTABLE_CATALYSEUR) {
>             aDonner = aPlacer;
>             deuxVils = true;
>         }
>         else {
>             if(propriete_case_type(aPlacer.element1) == TRANSMUTABLE_OR)
>                 aDonner.element1 = aPlacer.element1;
>             else
>                 aDonner.element1 = aPlacer.element2;
>         }
>         //if(nbParType[typetoint(aPlacer.element1)].second < nbParType[typetoint(aPlacer.element2)].second)
>         //    aDonner.element1 = aPlacer.element1;
>         //else
>         //    aDonner.element1 = aPlacer.element2;
>         //bool estVil = propriete_case_type(aDonner.element1) == TRANSMUTABLE_CATALYSEUR;
> 
>         /// Cas de l'élément 2, deux cas :
>         /// - Le métal choisi en 1er est normal. On lui donne un vil ?
>         /// - Le métal choisi est vil. Vaut mieux s'assurer une chance d'avoir un normal.
>         /// - Idée : si on recoit deux métaux vils, surtout répondre par la même !
>         if(!deuxVils) {
>             sort(nbParType.begin(), nbParType.end(), compareTypePresence);
>             for(pair<int, int> typ : nbParType)
245,246c292,297
<                 aDonner.element2 = inttotype(typ.first);
<                 break;
---
>                 if(propriete_case_type(inttotype(typ.first)) == TRANSMUTABLE_CATALYSEUR)
>                 //if(aDonner.element1 != inttotype(typ.first) && aDonner.element2 != inttotype(typ.first))
>                 {
>                     aDonner.element2 = inttotype(typ.first);
>                     break;
>                 }
252c303
<     //consommerMetauxVils();
---
>     consommerMetauxVils();
