#include "mess.h"


THE_GAME {
    if (grille_vide()) {
        placer_echantillon($P(0, 0), $P(0, 1));
        return;
    }
    Situation retenue = {0};

    POUR_CHAQUE_POSITION(p) {
        int pre_cout = valeur(p, moi()) - taille_region(p, moi());

        transmuter(p);
        POUR_CHAQUE_POSITION(q) {
            int cout = pre_cout + valeur(q, moi()) - taille_region(q, moi());

            transmuter(q);
            POUR_CHAQUE_PLACEMENT(s, echantillon_tour(), moi()) {
                Situation actuelle = {0};

                actuelle.gain[0] = actuelle.gain[1] = cout;
                placer_echantillon(s.pos1, s.pos2);
                {
                    if (propriete_case_type(type_case(s.pos1, moi()))
                        == TRANSMUTABLE_OR)
                        actuelle.gain[0] += potentiel(s.pos1, moi());
                    else
                        actuelle.gain[1] += potentiel(s.pos1, moi());

                    if (propriete_case_type(type_case(s.pos2, moi()))
                        == TRANSMUTABLE_OR)
                        actuelle.gain[0] += potentiel(s.pos2, moi());
                    else
                        actuelle.gain[1] += potentiel(s.pos2, moi());
                }
                annuler();

                POUR_CHAQUE_VOISIN(v, s.pos1)
                    if (type_case(v, moi()))
                        actuelle.gain[2]++;
                POUR_CHAQUE_VOISIN(v, s.pos2)
                    if (type_case(v, moi()))
                        actuelle.gain[2]++;
                actuelle.p = p, actuelle.q = q, actuelle.s = s;

                if (meilleure(actuelle, retenue))
                    retenue = actuelle;
            }
            annuler();

            if (!est_vide(q, moi()) && nombre_catalyseurs() > 0)
                for (int element = PLOMB; element <= MERCURE; element++) {
                    if (type_case(q, moi()) == element)
                        continue;
                    catalyser(q, moi(), element);
                    POUR_CHAQUE_PLACEMENT(s, echantillon_tour(), moi()) {
                        Situation actuelle = {0};

                        actuelle.gain[0] = actuelle.gain[1] = pre_cout;
                        placer_echantillon(s.pos1, s.pos2);
                        {
                            if (propriete_case_type(type_case(s.pos1, moi()))
                                == TRANSMUTABLE_OR)
                                actuelle.gain[0] += potentiel(s.pos1, moi());
                            else
                                actuelle.gain[1] += potentiel(s.pos1, moi());

                            if (propriete_case_type(type_case(s.pos2, moi()))
                                == TRANSMUTABLE_OR)
                                actuelle.gain[0] += potentiel(s.pos2, moi());
                            else
                                actuelle.gain[1] += potentiel(s.pos2, moi());
                        }
                        annuler();

                        POUR_CHAQUE_VOISIN(v, s.pos1)
                            if (type_case(v, moi()))
                                actuelle.gain[2]++;
                        POUR_CHAQUE_VOISIN(v, s.pos2)
                            if (type_case(v, moi()))
                                actuelle.gain[2]++;
                        actuelle.p = p, actuelle.q = q, actuelle.s = s;
                        actuelle.element = element;

                        if (meilleure(actuelle, retenue))
                            retenue = actuelle;
                    }
                    annuler();
                }
        }
        annuler();

        if (retenue.gain[0] + retenue.gain[1] > 0) {
            transmuter(retenue.p);
            if (retenue.element)
                catalyser(retenue.q, moi(), retenue.element);
            else
                transmuter(retenue.q);
            placer_echantillon(retenue.s.pos1, retenue.s.pos2);
        }

        /* TODO Mitiger la taille des régions d'éléments catalyseur */



        /* TODO Action du dernier tour -- judicieusement catalyser soi-même */
    }
}
