protected override double GetStateEvaluation(AIGameState state)
    {
        /*
         * CONTRINCANTES:
         * - Cuanto más masa, peor
         * - Cuanto menos slimes, mejor (me atacaran menos)
         * - Cuanto menos me puedan atacar, mejor
         * YO:
         * - Cuanto más masa, mejor
         * - Cuanto más slimes
         * - Cuanto más cerca de una slime enemiga con menos masa, mejor
         * CONQUERIR???
         */
        //bool hasRange = false;


        double    score  = 1000;
        RawPlayer winner = state.IsGameEndedAndWinner();

        if (winner != null && winner.GetId() == playerId)
        {
            score += 10000; // if it wins
        }
        else if (winner != null || state.GetPlayerById(playerId) == null)
        {
            score -= 10000; // if it loses
        }
        else
        {
            RawPlayer player = state.GetPlayerById(playerId);

            // Contrincantes
            List <RawPlayer> enemies = state.GetPlayers().FindAll(p => true);
            enemies.Remove(player);

            // INFO sobre el JUGADOR
            int    playerSlimes    = player.GetSlimes().Count;
            double totalPlayerMass = 0;

            int distanceToEnemy = Int16.MaxValue;
            foreach (RawSlime sl in player.GetSlimes())
            {
                totalPlayerMass += sl.GetMass();
                distanceToEnemy  = Mathf.Min(distanceToEnemy, state.GetDistanceToCloserEnemy(sl));
            }


            // INFO sobre los ENEMIGOS
            int   enemiesSlimes          = 0;
            float totalEnemiesMass       = 0;
            int   enemiesThatCanAttackMe = 0;
            float minimumMass            = Int16.MaxValue;
            foreach (RawPlayer enemy in enemies)
            {
                foreach (RawSlime sl in enemy.GetSlimes())
                {
                    enemiesSlimes++;
                    totalEnemiesMass += sl.GetMass();

                    enemiesThatCanAttackMe += state.GetSlimesInAttackRange(sl).FindAll(r => r.GetPlayer().GetId() == player.GetId()).Count;
                    minimumMass             = Mathf.Min(sl.GetMass(), minimumMass);
                }
            }

            //Debug.Log("TOTAL AI MASS: " + totalPlayerMass);
            score += totalPlayerMass;            // Ens interessa tenir molta massa.
            score += playerSlimes * 5;           // Si pot dividirse per arribar al objectiu, ho fara

            score -= totalEnemiesMass * 10;      // Predileccio per atacar
            score -= enemiesSlimes * 100;        // slime morta
            score -= distanceToEnemy;            // Com menys distancia millor
            score -= enemiesThatCanAttackMe * 2; // Com menys enemics puguin atacarme, millor
            score -= minimumMass * 5;            // Predileccio per atacar al que esta mes fluix
            score -= enemies.Count * 200;        // Predileccio per acabar amb un jugador.
        }

        return(score * GetAIError());
    }