Пример #1
0
        protected override double ScoreSubBuff_IV(AIProcessor AI, Spells.EffectInfos Effect, List <Fighter> Targets, bool Reverse = false, bool notUseJet = false)
        {
            var Score     = 0;
            var BaseScore = 18;

            if (!notUseJet)
            {
                BaseScore *= Effect.RandomJet;
            }

            foreach (var Target in Targets)
            {
                int currScore   = BaseScore;
                var PercentLife = Math.Ceiling((double)(Target.Life / Target.MaxLife) * 100);
                if (PercentLife < 20)
                {
                    currScore *= 2;
                }
                else if (PercentLife < 30)
                {
                    currScore *= 3;
                }
                else if (PercentLife < 50)
                {
                    currScore *= 5;
                }
                else if (PercentLife < 75)
                {
                    currScore *= 8;
                }

                if (Effect.Duration > 0)
                {
                    currScore *= Effect.Duration;
                }
                if (Reverse)
                {
                    if (Target.Team != AI.myFighter.Team)
                    {
                        Score -= currScore * 2;
                    }
                    else
                    {
                        Score += currScore;
                    }
                }
                else
                {
                    if (Target.Team == AI.myFighter.Team)
                    {
                        Score -= currScore * 2;
                    }
                    else
                    {
                        Score += currScore;
                    }
                }
            }

            return(Score);
        }
Пример #2
0
        protected override double ScoreBuff_I(AIProcessor AI, Spells.EffectInfos Effect, List <Fighter> Targets, bool Reverse = false, bool notUseJet = false)
        {
            var Score     = 0;
            var BaseScore = 10;

            if (!notUseJet)
            {
                BaseScore *= Effect.RandomJet;
            }

            foreach (var Target in Targets)
            {
                int currScore = BaseScore;
                if (Target.States.HasState(FighterStateEnum.STATE_INVISIBLE) && Effect.EffectType == EffectEnum.Invisible)
                {
                    Score -= currScore;
                    continue;
                }
                var PercentLife = Math.Ceiling((double)(Target.Life / Target.MaxLife) * 100);
                if (PercentLife < 20)
                {
                    currScore *= 8;
                }
                else if (PercentLife < 30)
                {
                    currScore *= 5;
                }
                else if (PercentLife < 50)
                {
                    currScore *= 3;
                }
                else if (PercentLife < 75)
                {
                    currScore *= 2;
                }

                if (Effect.Duration > 0)
                {
                    currScore *= Effect.Duration;
                }
                if (Reverse)
                {
                    if (Target.Team == AI.myFighter.Team)
                    {
                        Score -= currScore * 2;
                    }
                    else
                    {
                        Score += currScore;
                    }
                }
                else
                {
                    if (Target.Team != AI.myFighter.Team)
                    {
                        Score -= currScore * 2;
                    }
                    else
                    {
                        Score += currScore;
                    }
                }
            }

            return(Score);
        }
Пример #3
0
        protected override double ScoreInvocation(AIProcessor AI, Spells.EffectInfos Effect, List <Fighter> Targets, bool Reverse = false, bool InvokPreview = false)
        {
            if (Reverse)//On evite la boucle infinie
            {
                return(0);
            }
            var BaseScore = 11;
            var Score     = BaseScore;

            var InvocationId    = Effect.Value1;
            var InvocationLevel = Effect.Value2;

            if (InvokPreview)
            {
                return(BaseScore * InvocationLevel);
            }
            if (!AI.myNeuron.myScoreInvocations.ContainsKey(InvocationId))
            {
                var Monster = MonsterTable.GetMonster(InvocationId);
                // Template de monstre existante
                if (Monster != null)
                {
                    Monster.Initialize();
                    var MonsterLevel = Monster.GetLevelOrNear(InvocationLevel);
                    // Level de monstre existant
                    if (MonsterLevel != null)
                    {
                        List <Fighter> possibleTargets = AI.myFight.GetAllyTeam(AI.myFighter.Team).GetFighters().FindAll(x => !x.Dead && !x.Left);
                        foreach (var Spell in MonsterLevel.Spells.GetSpells())
                        {
                            foreach (var spellEffect in Spell.Effects)
                            {
                                int currScore = (int)this.GetEffectScore(AI, -1, -1, spellEffect, possibleTargets, InvokPreview: true);
                                if (currScore > 0)
                                {
                                    Score += currScore;
                                }
                            }
                        }
                        possibleTargets = AI.myFight.GetEnnemyTeam(AI.myFighter.Team).GetFighters().FindAll(x => !x.Dead && !x.Left);
                        foreach (var Spell in MonsterLevel.Spells.GetSpells())
                        {
                            foreach (var spellEffect in Spell.Effects)
                            {
                                int currScore = (int)this.GetEffectScore(AI, -1, -1, spellEffect, possibleTargets, InvokPreview: true);
                                if (currScore > 0)
                                {
                                    Score += currScore;
                                }
                            }
                        }
                        foreach (var State in MonsterLevel.Stats.GetEffects().Values)
                        {
                            var total = State.Total;
                            if (total > 0)
                            {
                                Score += total;
                            }
                        }
                        Score *= MonsterLevel.Level;
                        AI.myNeuron.myScoreInvocations.Add(InvocationId, Score);
                        return(Score);
                    }
                }
            }
            else
            {
                return(AI.myNeuron.myScoreInvocations[InvocationId]);
            }
            return(0);
        }
Пример #4
0
        private int ScorePush(AIProcessor AI, Fighter Target, int Direction, int Length, bool Fear)
        {
            bool           isAlly     = Target.Team == AI.myFighter.Team;
            List <Fighter> TargetList = new List <Fighter>()
            {
                Target
            };
            var LastCell = Target.Cell;
            int Score    = 0;

            foreach (var Layer in Target.Cell.GetObjects <FightGroundLayer>())//On cherche à savoir si décaller de cette cellule est utile
            {
                int LayerScore = 0;
                foreach (var Effect in Layer.CastSpell.Effects)
                {
                    LayerScore = (int)Math.Floor(AIAction.AIActions[AIActionEnum.SELF_ACTING].GetEffectScore(AI, -1, -1, Effect, TargetList, true, true));
                }
                if (Layer is FightBlypheLayer)
                {
                    LayerScore *= 2;
                }
                Score += LayerScore;
            }

            int PathScore   = 4;
            int FinalLength = 0;

            for (int i = 0; i < Length; i++)
            {
                var NextCell = Target.Fight.GetCell(Pathfinder.NextCell(Target.Fight.Map, LastCell.Id, Direction));
                if (NextCell != null)
                {
                    LastCell = NextCell;
                }

                if (NextCell != null && NextCell.IsWalkable())
                {
                    if (NextCell.HasGameObject(FightObjectType.OBJECT_FIGHTER) || NextCell.HasGameObject(FightObjectType.OBJECT_STATIC) || Target.States.HasState(FighterStateEnum.STATE_ENRACINER))
                    {
                        if (!Fear)
                        {
                            PathScore *= EffectPush.RANDOM_PUSHDAMAGE.Next(4, 7);
                            if (isAlly)
                            {
                                PathScore *= -1;
                            }
                        }
                        break;
                    }
                    else if (NextCell.HasGameObject(FightObjectType.OBJECT_TRAP))
                    {//On Stop seulement : ce genre de calcul se fera a la fin.
                        break;
                    }
                }
                else
                {
                    if (!Fear)
                    {
                        PathScore *= EffectPush.RANDOM_PUSHDAMAGE.Next(4, 7);
                        if (isAlly)
                        {
                            PathScore *= -1;
                        }
                    }
                    break;
                }
                FinalLength += 1;
            }
            Score += FinalLength * PathScore;
            if (LastCell != Target.Cell)
            {
                foreach (var Layer in LastCell.GetObjects <FightGroundLayer>())
                {
                    int LayerScore = 0;
                    foreach (var Effect in Layer.CastSpell.Effects)
                    {
                        LayerScore += (int)Math.Floor(AIAction.AIActions[AIActionEnum.SELF_ACTING].GetEffectScore(AI, -1, -1, Effect, TargetList, false, true));
                    }
                    if (Layer is FightTrapLayer) // TODO : Calculate if traplayer others targets
                    {
                        LayerScore *= 4;         //Immediat
                    }
                    else if (Layer is FightBlypheLayer)
                    {
                        LayerScore *= 2;//Debut de tour
                    }
                    Score += LayerScore;
                }
            }

            return(Score);
        }
Пример #5
0
 protected abstract double ScoreUseLayer(AIProcessor AI, int CastCell, EffectInfos Effect, List <Fighter> Targets, bool Reverse = false, bool notUseJet = false);
Пример #6
0
        public double GetEffectScore(AIProcessor AI, int CasterCell, int CastCell, EffectInfos Effect, List <Fighter> Targets, bool Reverse = false, bool InvokPreview = false)
        {
            switch (Effect.EffectType)
            {
            /* HEAL */
            case EffectEnum.RenderedPDV:
            case EffectEnum.Heal:
            case EffectEnum.DamageDropLife:
                return(ScoreHeal(AI, Effect, Targets, Reverse));

            /* BUFFS LEVEL 1*/
            case EffectEnum.ChanceEcaflip:
                return(Targets.Contains(AI.myFighter) ? (ScoreBuff_I(AI, Effect, Targets, Reverse)) : (-ScoreBuff_I(AI, Effect, Targets, Reverse)));

            case EffectEnum.AddDamagePhysic:
            case EffectEnum.AddDamageMagic:
            case EffectEnum.AddDamagePercent:
            case EffectEnum.AddForce:
            case EffectEnum.AddIntelligence:
            case EffectEnum.AddChance:
            case EffectEnum.AddSagesse:
            case EffectEnum.AddAgilite:
            case EffectEnum.AddEsquivePA:
            case EffectEnum.AddEsquivePM:
                return(ScoreBuff_I(AI, Effect, Targets, Reverse));

            /* BUFFS LEVEL 2*/
            case EffectEnum.Invisible:
                return(ScoreBuff_II(AI, Effect, Targets, Reverse, true));

            case EffectEnum.BonusPM:
            case EffectEnum.AddPA:
            case EffectEnum.AddPABis:
            case EffectEnum.AddPO:
            case EffectEnum.AddPM:
            case EffectEnum.AddVitalite:
            case EffectEnum.DoubleDamageOrRendPDV:
            case EffectEnum.AddVie:
            case EffectEnum.AddDamage:
            case EffectEnum.AddCC:
            case EffectEnum.AddSoins:
            case EffectEnum.MultiplyDamage:
            case EffectEnum.AddReduceDamageMagic:
            case EffectEnum.AddReduceDamagePhysic:
                return(ScoreBuff_II(AI, Effect, Targets, Reverse));

            /* BUFFS LEVEL 3*/
            case EffectEnum.IncreaseSpellDamage:
            case EffectEnum.AddArmorBis:
            case EffectEnum.ReflectSpell:
            case EffectEnum.AddArmorNeutre:
            case EffectEnum.AddArmorTerre:
            case EffectEnum.AddArmorFeu:
            case EffectEnum.AddArmorEau:
            case EffectEnum.AddArmorAir:
            case EffectEnum.AddReduceDamagePourcentAir:
            case EffectEnum.AddReduceDamagePourcentEau:
            case EffectEnum.AddReduceDamagePourcentFeu:
            case EffectEnum.AddReduceDamagePourcentTerre:
            case EffectEnum.AddReduceDamagePourcentNeutre:
            case EffectEnum.AddReduceDamageAir:
            case EffectEnum.AddReduceDamageEau:
            case EffectEnum.AddReduceDamageFeu:
            case EffectEnum.AddReduceDamageTerre:
            case EffectEnum.AddReduceDamageNeutre:
            case EffectEnum.AddArmor:
            case EffectEnum.AddRenvoiDamage:
            case EffectEnum.Sacrifice:
                return(ScoreBuff_III(AI, Effect, Targets, Reverse));

            /* DAMAGE LEVEL 3*/
            case EffectEnum.VolEau:
            case EffectEnum.VolTerre:
            case EffectEnum.VolAir:
            case EffectEnum.VolFeu:
            case EffectEnum.VolNeutre:
            case EffectEnum.Punition:
                return(ScoreDamage_III(AI, Effect, Targets, Reverse));

            /* DAMAGE LEVEL 2*/
            case EffectEnum.VolVie:
            case EffectEnum.DamageLifeAir:
            case EffectEnum.DamageLifeEau:
            case EffectEnum.DamageLifeFeu:
            case EffectEnum.DamageLifeNeutre:
            case EffectEnum.DamageLifeTerre:
                return(ScoreDamage_II(AI, Effect, Targets, Reverse));

            /* DAMAGE LEVEL 1*/
            case EffectEnum.DamageEau:
            case EffectEnum.DamageTerre:
            case EffectEnum.DamageAir:
            case EffectEnum.DamageFeu:
            case EffectEnum.DamageNeutre:
                return(ScoreDamage_I(AI, Effect, Targets, Reverse));

            /* DAMAGE LEVEL 0*/
            case EffectEnum.DamageLanceur:
                return(ScoreDamage_0(AI, Effect, Targets, Reverse));

            /* SUBBUFF LEVEL 4*/
            case EffectEnum.TurnPass:
            case EffectEnum.DieFighter:
                return(ScoreSubBuff_IV(AI, Effect, Targets, Reverse, true));

            /* SUBBUFF LEVEL 3*/
            case EffectEnum.VolPA:
            case EffectEnum.VolPO:
            case EffectEnum.VolPM:
            case EffectEnum.SubPA:
            case EffectEnum.SubPM:
            case EffectEnum.SubPO:
            case EffectEnum.SubDamage:
            case EffectEnum.SubVitalite:
            case EffectEnum.SubReduceDamagePourcentNeutre:
            case EffectEnum.SubReduceDamagePourcentFeu:
            case EffectEnum.SubReduceDamagePourcentEau:
            case EffectEnum.SubReduceDamagePourcentAir:
            case EffectEnum.SubReduceDamagePourcentTerre:
                return(ScoreSubBuff_III(AI, Effect, Targets, Reverse));

            /* SUBBUFF LEVEL 2*/
            case EffectEnum.DamagePerPA:
                return(ScoreDamagesPerPA(AI, Effect, Targets, Reverse));

            case EffectEnum.SubSoins:
            case EffectEnum.SubSagesse:
            case EffectEnum.SubForce:
            case EffectEnum.SubAgilite:
            case EffectEnum.SubChance:
            case EffectEnum.SubIntelligence:
            case EffectEnum.SubDamagePercent:
            case EffectEnum.SubDamagePhysic:
            case EffectEnum.SubDamageMagic:
            case EffectEnum.SubCC:
            case EffectEnum.AddEchecCritic:
                return(ScoreSubBuff_II(AI, Effect, Targets, Reverse));

            /* SUBBUFF LEVEL 1*/
            case EffectEnum.SubReduceDamageAir:
            case EffectEnum.SubReduceDamageEau:
            case EffectEnum.SubReduceDamageFeu:
            case EffectEnum.SubReduceDamageNeutre:
            case EffectEnum.SubReduceDamageTerre:
            case EffectEnum.SubPAEsquivable:
            case EffectEnum.SubPMEsquivable:
                return(ScoreSubBuff_I(AI, Effect, Targets, Reverse));

            /* ADDSTATE */
            case EffectEnum.AddState:
            {
                if (isGoodState(Effect))
                {
                    return(ScoreAddStateGood(AI, Effect, Targets, Reverse));
                }
                else
                {
                    return(ScoreAddStateBad(AI, Effect, Targets, Reverse));
                }
            }

            /* REMSTATE */
            case EffectEnum.LostState:
            {
                if (isGoodState(Effect))
                {
                    return(ScoreRemStateGood(AI, Effect, Targets, Reverse));
                }
                else
                {
                    return(ScoreRemStateBad(AI, Effect, Targets, Reverse));
                }
            }

            /* REPULSE */
            case EffectEnum.PushBack:
                return(ScoreRepulse(AI, CastCell, Effect, Targets, InvokPreview, false));

            case EffectEnum.PushFear:
                return(ScoreRepulse(AI, CastCell, Effect, Targets, InvokPreview, true));

            /* ATTRACT */
            case EffectEnum.PushFront:
                return(ScoreAttract(AI, CastCell, Effect, Targets, InvokPreview));

            /* DEPLACE */
            case EffectEnum.Porter:
                return(ScoreDeplace(AI, CastCell, Effect, Targets, InvokPreview, false));

            case EffectEnum.Lancer:
                return(ScoreDeplace(AI, CastCell, Effect, Targets, InvokPreview, true));

            /* EXCHANGE PLACE */
            case EffectEnum.Transpose:
                return(ScoreExchangePlace(AI, CasterCell, CastCell, Effect, Targets, InvokPreview));

            /* DEBUFF */
            case EffectEnum.DeleteAllBonus:
                return(ScoreDebuff(AI, Effect, Targets, Reverse));

            /* INVOCATION */
            case EffectEnum.InvocationStatic:
                return(ScoreInvocationStatic(AI, Effect, Targets, Reverse, InvokPreview));

            case EffectEnum.Invocation:
                return(ScoreInvocation(AI, Effect, Targets, Reverse, InvokPreview));

            case EffectEnum.DieFighterReplaceInvocation:
                return(ScoreSubBuff_IV(AI, Effect, Targets, Reverse, true) + ScoreInvocation(AI, Effect, Targets, Reverse, InvokPreview));

            case EffectEnum.UseGlyph:
            case EffectEnum.UseBlyph:
            case EffectEnum.UseTrap:
                return(ScoreUseLayer(AI, CastCell, Effect, Targets, Reverse));

            /* NADA */
            case EffectEnum.DoNothing:
                return(0);

            default:
            {
                Logger.Info("Effect[" + Effect.EffectType + "] non defini pour l'IA");
                return(ScoreDamage_I(AI, Effect, Targets, Reverse));
            }
            }
        }
Пример #7
0
 protected abstract double ScoreDeplace(AIProcessor AI, int CastCell, EffectInfos Effect, List <Fighter> Targets, bool InvokPreview, bool isThrow);
Пример #8
0
 protected abstract double ScoreExchangePlace(AIProcessor AI, int CasterCell, int CastCell, EffectInfos Effect, List <Fighter> Targets, bool InvokPreview);
Пример #9
0
 protected abstract double ScoreRepulse(AIProcessor AI, int CastCell, EffectInfos Effect, List <Fighter> Targets, bool InvokPreview, bool isFear);
Пример #10
0
 protected abstract double ScoreInvocationStatic(AIProcessor AI, EffectInfos Effect, List <Fighter> Targets, bool Reverse = false, bool InvokPreview = false);
Пример #11
0
 protected abstract double ScoreDebuff(AIProcessor AI, EffectInfos Effect, List <Fighter> Targets, bool Reverse = false);
Пример #12
0
 protected abstract double ScoreSubBuff_IV(AIProcessor AI, EffectInfos Effect, List <Fighter> Targets, bool Reverse   = false, bool notUseJet = false);
Пример #13
0
 public void Play(AIProcessor IA)
 {
     this.Invoke("Play", IA);
 }