示例#1
0
        public override SpellCastResult CanCastSpell(SpellCastInformations cast)
        {
            var result = base.CanCastSpell(cast);

            if (result == SpellCastResult.OK || cast.IsConditionBypassed(result))
            {
                return(result);
            }

            if (cast.Silent)
            {
                return(result);
            }

            switch (result)
            {
            case SpellCastResult.NO_LOS:
                // Impossible de lancer ce sort : un obstacle gène votre vue !
                Character.SendInformationMessage(TextInformationTypeEnum.TEXT_INFORMATION_ERROR, 174);
                break;

            case SpellCastResult.HAS_NOT_SPELL:
                // Impossible de lancer ce sort : vous ne le possédez pas !
                Character.SendInformationMessage(TextInformationTypeEnum.TEXT_INFORMATION_ERROR, 169);
                break;

            case SpellCastResult.NOT_ENOUGH_AP:
                // Impossible de lancer ce sort : Vous avez %1 PA disponible(s) et il vous en faut %2 pour ce sort !
                Character.SendInformationMessage(TextInformationTypeEnum.TEXT_INFORMATION_ERROR, 170, AP, cast.SpellLevel.ApCost);
                break;

            case SpellCastResult.UNWALKABLE_CELL:
                // Impossible de lancer ce sort : la cellule visée n'est pas disponible !
                Character.SendInformationMessage(TextInformationTypeEnum.TEXT_INFORMATION_ERROR, 172);
                break;

            case SpellCastResult.CELL_NOT_FREE:
                //Impossible de lancer ce sort : la cellule visée n'est pas valide !
                Character.SendInformationMessage(TextInformationTypeEnum.TEXT_INFORMATION_ERROR, 193);
                break;

            default:
                //Impossible de lancer ce sort actuellement.
                Character.SendInformationMessage(TextInformationTypeEnum.TEXT_INFORMATION_ERROR, 175);
                break;
            }

            return(result);
        }
示例#2
0
 public TemporalDustCastHandler(SpellCastInformations cast)
     : base(cast)
 {
 }
示例#3
0
 public FeuillageCastHandler(SpellCastInformations cast)
     : base(cast)
 {
 }
示例#4
0
 public MansomonCastHandler(SpellCastInformations cast)
     : base(cast)
 {
 }
示例#5
0
 public RoublabotCastHandler(SpellCastInformations cast)
     : base(cast)
 {
 }
示例#6
0
 public PunishmentCastHandler(SpellCastInformations cast)
     : base(cast)
 {
 }
示例#7
0
 public FriendshipWordCastHandler(SpellCastInformations informations)
     : base(informations)
 {
 }
示例#8
0
 public ExplosionCastHandler(SpellCastInformations cast)
     : base(cast)
 {
 }
示例#9
0
 public SpellCastHandler GetSpellCastHandler(SpellCastInformations cast)
 {
     return(m_spellsCastHandler.TryGetValue(cast.Spell.Template.Id, out var ctor) ? ctor(cast) : new DefaultSpellCastHandler(cast));
 }
示例#10
0
 public KickSpellCastHandler(SpellCastInformations cast)
     : base(cast)
 {
 }
示例#11
0
        public override bool CastSpell(SpellCastInformations cast)
        {
            if (!IsFighterTurn() && !cast.Force)
            {
                return(false);
            }

            // not a weapon attack
            if (cast.Spell.Id != 0 || Character.Inventory.TryGetItem(CharacterInventoryPositionEnum.ACCESSORY_POSITION_WEAPON) == null)
            {
                return(base.CastSpell(cast));
            }

            var weapon = Character.Inventory.TryGetItem(CharacterInventoryPositionEnum.ACCESSORY_POSITION_WEAPON);

            if (!(weapon.Template is WeaponTemplate weaponTemplate) || !CanUseWeapon(cast.TargetedCell, weaponTemplate))
            {
                OnSpellCastFailed(cast);
                return(false);
            }

            using (Fight.StartSequence(SequenceTypeEnum.SEQUENCE_WEAPON))
            {
                var random   = new AsyncRandom();
                var critical = RollCriticalDice(weaponTemplate);

                switch (critical)
                {
                case FightSpellCastCriticalEnum.CRITICAL_FAIL:
                    OnWeaponUsed(weaponTemplate, cast.TargetedCell, critical, false);

                    if (!cast.ApFree)
                    {
                        UseAP((short)weaponTemplate.ApCost);
                    }

                    PassTurn();

                    return(false);

                case FightSpellCastCriticalEnum.CRITICAL_HIT:
                    m_criticalWeaponBonus = weaponTemplate.CriticalHitBonus;
                    break;
                }

                m_isUsingWeapon = true;
                var effects =
                    weapon.Effects.Where(entry => EffectManager.Instance.IsUnRandomableWeaponEffect(entry.EffectId)).OfType <EffectDice>();
                var handlers = new List <SpellEffectHandler>();
                foreach (var effect in effects)
                {
                    if (effect.Random > 0)
                    {
                        if (random.NextDouble() > effect.Random / 100d)
                        {
                            // effect ignored
                            continue;
                        }
                    }

                    var handler = EffectManager.Instance.GetSpellEffectHandler(effect, this, new DefaultSpellCastHandler(cast), cast.TargetedCell,
                                                                               critical == FightSpellCastCriticalEnum.CRITICAL_HIT);

                    handler.EffectZone = new Zone(weaponTemplate.Type.ZoneShape, (byte)weaponTemplate.Type.ZoneSize, (byte)weaponTemplate.Type.ZoneMinSize,
                                                  handler.CastPoint.OrientationTo(handler.TargetedPoint), (int)weaponTemplate.Type.ZoneEfficiencyPercent, (int)weaponTemplate.Type.ZoneMaxEfficiency);

                    handler.Targets = new TargetCriterion[]
                    { new TargetTypeCriterion(SpellTargetType.ALLY_ALL_EXCEPT_SELF, false), new TargetTypeCriterion(SpellTargetType.ENEMY_ALL, false) };     // everyone but caster

                    handlers.Add(handler);
                }

                var silentCast = handlers.Any(entry => entry.RequireSilentCast());

                OnWeaponUsed(weaponTemplate, cast.TargetedCell, critical, silentCast);

                if (!cast.ApFree)
                {
                    UseAP((short)weaponTemplate.ApCost);
                }

                foreach (var handler in handlers)
                {
                    handler.Apply();
                }
            }

            m_isUsingWeapon       = false;
            m_criticalWeaponBonus = 0;

            // is it the right place to do that ?
            Fight.CheckFightEnd();

            return(true);
        }
 public SacrifiedDeadSpellCastHandler(SpellCastInformations cast)
     : base(cast)
 {
 }
示例#13
0
 public OldToyParadeCastHandler(SpellCastInformations cast)
     : base(cast)
 {
 }
示例#14
0
 public HammerCastHandler(SpellCastInformations cast)
     : base(cast)
 {
 }
示例#15
0
 public NaughtyChildCastHandler(SpellCastInformations cast)
     : base(cast)
 {
 }
示例#16
0
 public FateOfEcaflipCastHandler(SpellCastInformations cast)
     : base(cast)
 {
 }
示例#17
0
 public DefaultSpellCastHandler(SpellCastInformations cast)
     : base(cast)
 {
 }
示例#18
0
 protected SpellCastHandler(SpellCastInformations informations)
 {
     Informations = informations;
 }