/// <summary>
        /// Indique au système de récompenses que des dégâts ont été infligés à une entité.
        /// </summary>
        /// <param name="source">Entité infligeant les dégâts.</param>
        /// <param name="destination">Entité subissant les dégâts.</param>
        /// <param name="damageAmount">Nombre de dégâts bruts subis par l'entité destination.</param>
        public void NotifyDamageDealt(EntityBase source, EntityBase destination, float damageAmount)
        {
            EntityHero dst = destination as EntityHero;
            EntityHero src = source as EntityHero;

            if (src != null && dst != null)
            {
                AddAttacker(dst, src);
                RewardConstants constants = GameServer.GetScene().Constants.Rewards;
                // Distribue des PAs au Tank
                if (dst.Role == EntityHeroRole.Tank)
                {
                    // Vérifie qu'il y a des héros alliés en combat
                    EntityCollection inrange = GameServer.GetMap().Entities.GetAliveEntitiesInRange(dst.Position, constants.TankPAPerHPLostRange);
                    inrange = inrange.GetEntitiesByType((dst.Type & EntityType.Teams) | EntityType.Player);
                    if (inrange.Count != 0)
                    {
                        dst.PA += damageAmount * constants.TankPAPerHPLost;
                    }
                }

                // Distribues des PAs à l'attaquant si c'est un combattant.
                if (src.Role == EntityHeroRole.Fighter)
                {
                    src.PA += damageAmount * constants.FighterPAPerDamageDealt;
                }
            }
        }
        /// <summary>
        /// Indique au système de récompenses qu'une unité a été tuée.
        /// </summary>
        /// <param name="unit">Unité tuée.</param>
        /// <param name="killer">Unité ayant porté le dernier coup.</param>
        public void NotifyUnitDeath(EntityBase unit, EntityHero killer)
        {
            RewardConstants constants = GameServer.GetScene().Constants.Rewards;

            // Si l'unité est un Virus, on offre une récompense aux héros proches.
            if (unit.Type.HasFlag(EntityType.Virus) || unit.Type.HasFlag(EntityType.Monster))
            {
                if (killer != null)
                {
                    if (unit.Type.HasFlag(EntityType.Virus))
                    {
                        killer.Stats.TotalVirusSlain++;
                    }
                    if (unit.Type.HasFlag(EntityType.Monster))
                    {
                        killer.Stats.TotalNeutralMonstersSlain++;
                    }
                }
                foreach (EntityHero hero in m_allHeroes)
                {
                    // Si le héros est dans l'équipe adverse du Virus/monstre tué.
                    if (!hero.Type.HasFlag(unit.Type & EntityType.Teams))
                    {
                        if (Vector2.DistanceSquared(hero.Position, unit.Position) <=
                            constants.VirusDeathRewardRange * constants.VirusDeathRewardRange)
                        {
                            hero.PA += constants.VirusDeathReward;
                        }
                    }
                }
            }
            else if (unit.Type.HasFlag(EntityType.Tower))
            {
                foreach (EntityHero hero in m_allHeroes)
                {
                    // Si le héros est dans l'équipe adverse de la tour tuée
                    // Applique le bonus du combattant lors de la destruction d'une tour.
                    if (!hero.Type.HasFlag(unit.Type & EntityType.Teams) &&
                        hero.Role == EntityHeroRole.Tank)
                    {
                        if (Vector2.DistanceSquared(hero.Position, unit.Position) <=
                            constants.TankTowerDestructionBonusRange * constants.TankTowerDestructionBonusRange)
                        {
                            hero.PA += constants.TankTowerDestructionBonus;
                        }
                    }
                }
            }

            // Récompense du HUNTER
            if (killer != null)
            {
                if (unit.Type.HasFlag(EntityType.Monster) && killer.UniquePassive == EntityUniquePassives.Hunter)
                {
                    killer.PA += GameServer.GetScene().Constants.UniquePassives.HunterBonusGold;
                }
            }
        }
 /// <summary>
 /// Crée une nouvelle instance de GameConstants avec des constantes par défaut.
 /// </summary>
 public GameConstants()
 {
     Vision              = new VisionConstants();
     Structures          = new StructureConstants();
     Virus               = new VirusConstants();
     Roles               = new RoleConstants();
     Rewards             = new RewardConstants();
     Events              = new EventConstants();
     CampMonsters        = new CampMonsterConstants();
     Routers             = new RouterConstants();
     BuffedVirus         = new VirusConstants();
     UniquePassives      = new UniquePassiveConstants();
     ActiveSpells        = new ActiveSpellsConstants();
     Equip               = new EquipConstants();
     Heroes              = new HeroConstants();
     Towers              = new TowerConstants();
     DatacenterConstants = new DatacenterConstants();
     MiningFarms         = new MiningfarmConstants();
 }
        /// <summary>
        /// Indique au système de récompenses qu'un héros a été tué.
        /// </summary>
        /// <param name="unit">Unité tuée.</param>
        /// <param name="killer">Unité ayant porté le dernier coup.</param>
        public void NotityHeroDeath(EntityHero unit, EntityHero killer)
        {
            if (killer == null)
            {
                return;
            }

            EntityType killerTeam = killer.Type & EntityType.Teams;

            // On donne une récompense au tueur.
            RewardConstants constants = GameServer.GetScene().Constants.Rewards;

            killer.PA += constants.KillReward;
            killer.Stats.TotalKills++;
            // Bonus de PA/Kill pour le passif rugged.
            if (killer.UniquePassive == EntityUniquePassives.Rugged && killer.UniquePassiveLevel == 2)
            {
                killer.PA += GameServer.GetScene().Constants.UniquePassives.RuggedKillReward;
            }

            // On mémorise les héros déjà récompensés pour les assist
            List <EntityHero> rewarded = new List <EntityHero>();

            if (m_assistants.ContainsKey(killer))
            {
                foreach (var kvp in m_assistants[killer])
                {
                    EntityHero assistant = kvp.Key as EntityHero;
                    if (assistant != null)
                    {
                        assistant.PA += constants.AssistReward;
                        assistant.Stats.TotalAssists++;
                        // Bonus d'assist du combattant.
                        if (assistant.Role == EntityHeroRole.Fighter)
                        {
                            assistant.PA += constants.TankAssistBonus;
                        }

                        // Bonus d'assist du mage.
                        if (assistant.Role == EntityHeroRole.Mage)
                        {
                            assistant.PA += constants.MageAssistBonus;
                        }

                        rewarded.Add(assistant);
                    }
                }
            }

            if (m_attackers.ContainsKey(unit))
            {
                foreach (var kvp in m_attackers[unit])
                {
                    EntityHero attacker = kvp.Key as EntityHero;
                    // On ne récompense l'attaqueur que s'il n'a pas déjà été récompensé
                    // par la prime d'assist.
                    if (attacker != null && !rewarded.Contains(attacker))
                    {
                        attacker.PA += constants.AssistReward;
                        attacker.Stats.TotalAssists++;
                        // Bonus du combattant.
                        if (attacker.Role == EntityHeroRole.Fighter)
                        {
                            attacker.PA += constants.TankAssistBonus;
                        }

                        // Bonus d'assist du mage.
                        if (attacker.Role == EntityHeroRole.Mage)
                        {
                            attacker.PA += constants.MageAssistBonus;
                        }
                    }
                }
            }
        }