protected override double ScoreAttract(AIProcessor AI, int CastCell, EffectInfos Effect, List<Fighter> Targets, bool InvokPreview) { if (InvokPreview) { return 0; } int Score = 0; char d = Pathfinder.getDirBetweenTwoCase(CastCell, AI.myFighter.CellId, AI.myFight.Map, true); var EndCell = AI.myFight.GetCell(Pathfinder.DirToCellID(AI.myFighter.CellId, d, AI.myFight.Map, true)); var StartCell = AI.myFight.GetCell(CastCell); if (StartCell != null && EndCell != null) { var target = StartCell.GetFighter(); if (target != null) { Score += ScorePush(AI, target, Pathfinder.GetDirection(AI.myFight.Map, CastCell, AI.myFighter.CellId), Pathfinder.GoalDistance(AI.myFight.Map, CastCell, AI.myFighter.CellId), true); } } return Score; }
private static bool isGoodState(EffectInfos Effect) { switch ((FighterStateEnum)Effect.Value3) { case FighterStateEnum.STATE_ENRACINER: case FighterStateEnum.STATE_INVISIBLE: case FighterStateEnum.STATE_REFLECT_SPELL: case FighterStateEnum.STATE_SAOUL: case FighterStateEnum.STATE_PORTE: case FighterStateEnum.STATE_PORTEUR: { return(true); } case FighterStateEnum.STATE_AFFAIBLI: case FighterStateEnum.STATE_ALTRUISME: case FighterStateEnum.STATE_PESANTEUR: default: { return(false); } } }
protected override double ScoreRepulse(AIProcessor AI, int CastCell, EffectInfos Effect, List <Fighter> Targets, bool InvokPreview, bool isFear) { if (InvokPreview) { return(0); } var Score = 0; if (isFear) { char d = Pathfinder.getDirBetweenTwoCase(AI.myFighter.CellId, CastCell, AI.myFight.Map, true); var StartCell = AI.myFight.GetCell(Pathfinder.DirToCellID(AI.myFighter.CellId, d, AI.myFight.Map, true)); var EndCell = AI.myFight.GetCell(CastCell); if (StartCell != null && EndCell != null) { var target = StartCell.GetFighter(); if (target != null) { Score += ScorePush(AI, target, Pathfinder.GetDirection(AI.myFight.Map, AI.myFighter.CellId, CastCell), Pathfinder.GoalDistance(AI.myFight.Map, AI.myFighter.CellId, CastCell), true); } } } else { var StartCell = AI.myFight.GetCell(CastCell); if (StartCell != null) { var target = StartCell.GetFighter(); if (target != null) { Score += ScorePush(AI, target, Pathfinder.GetDirection(AI.myFight.Map, AI.myFighter.CellId, CastCell), Effect.Value1, false); } } } return(Score); }
protected override double ScoreUseLayer(AIProcessor AI, int CastCell, EffectInfos Effect, List <Fighter> Targets, bool Reverse = false, bool notUseJet = false) { int Score = 0; var spell = SpellTable.Cache[Effect.Value1]; if (spell != null) { var spellLevel = spell.GetLevel(Effect.Value2); if (spellLevel != null) { spellLevel.Initialize(); List <Fighter> possibleTargets = AI.myFight.GetEnnemyTeam(AI.myFighter.Team).GetFighters().FindAll(x => !x.Dead && !x.Left); int LayerScore = 0; foreach (var EffectLayer in spellLevel.Effects) { double Result = AIAction.AIActions[AIActionEnum.SELF_ACTING].GetEffectScore(AI, -1, -1, EffectLayer, possibleTargets, false, true); LayerScore += (int)Math.Floor(Result * 0.25); } Score += LayerScore; } } return(Score); }
protected override double ScoreExchangePlace(AIProcessor AI, int CasterCell, int CastCell, EffectInfos Effect, List <Fighter> Targets, bool InvokPreview) { int Score = 0; var TargetCell = AI.myFight.GetCell(CastCell); var LaunchCell = AI.myFight.GetCell(CasterCell); if (TargetCell != null) { var Target = TargetCell.GetFighter(); if (Target != null) { List <Fighter> TargetList = new List <Fighter>() { AI.myFighter }; foreach (var Layer in TargetCell.GetObjects <FightGroundLayer>()) { int LayerScore = 0; foreach (var EffectLayer 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) { LayerScore *= 4;//Immediat } else if (Layer is FightBlypheLayer) { LayerScore *= 2;//Debut de tour } Score += LayerScore; } TargetList = new List <Fighter>() { Target }; foreach (var Layer in LaunchCell.GetObjects <FightGroundLayer>()) { int LayerScore = 0; foreach (var EffectLayer 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) { LayerScore *= 4;//Immediat } else if (Layer is FightBlypheLayer) { LayerScore *= 2;//Debut de tour } Score += LayerScore; } } } return(Score); }
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)); } } }
protected abstract double ScoreUseLayer(AIProcessor AI, int CastCell, EffectInfos Effect, List <Fighter> Targets, bool Reverse = false, bool notUseJet = false);
protected abstract double ScoreExchangePlace(AIProcessor AI, int CasterCell, int CastCell, EffectInfos Effect, List <Fighter> Targets, bool InvokPreview);
protected abstract double ScoreDeplace(AIProcessor AI, int CastCell, EffectInfos Effect, List <Fighter> Targets, bool InvokPreview, bool isThrow);
protected abstract double ScoreRepulse(AIProcessor AI, int CastCell, EffectInfos Effect, List <Fighter> Targets, bool InvokPreview, bool isFear);
protected abstract double ScoreInvocationStatic(AIProcessor AI, EffectInfos Effect, List <Fighter> Targets, bool Reverse = false, bool InvokPreview = false);
protected abstract double ScoreDebuff(AIProcessor AI, EffectInfos Effect, List <Fighter> Targets, bool Reverse = false);
protected abstract double ScoreSubBuff_IV(AIProcessor AI, EffectInfos Effect, List <Fighter> Targets, bool Reverse = false, bool notUseJet = false);