public override void ProcessExitZone(TileMoveData moveData)
 {
     base.ProcessExitZone(moveData);
     if (this._data.Source != null && moveData.DoAttackOfOpportunity)
     {
         if (moveData.Target.Proxy.LParty != this._data.Source.Proxy.LParty)
         {
             var data = new ActionData();
             data.Ability         = EAbility.Attack_Of_Opportunity;
             data.DisplayDefended = false;
             data.Source          = this._data.Source;
             data.Target          = moveData.Target.Tile;
             data.WpnAbility      = false;
             this._action         = new MAction(data);
             moveData.ParentEvent.AddChildAction(this._action);
             this._action.TryProcessNoDisplay();
             foreach (var hit in this._action.Data.Hits)
             {
                 if (!FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Block) &&
                     !FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Dodge) &&
                     !FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Parry))
                 {
                     moveData.Callback(this);
                     this._action.AddCallback(moveData.ParentEvent.TryDone);
                 }
             }
             this._action.DisplayAction();
         }
     }
 }
예제 #2
0
        public void DoBash(object o)
        {
            var script = o as SAttackerJolt;
            var a      = script.GetObjectList()[0] as MAction;

            foreach (var hit in a.Data.Hits)
            {
                var tgt = hit.Data.Target.Current as CChar;
                if (FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Push))
                {
                    var tgtTile = hit.Data.Source.Tile.Model.GetPushTile(tgt.Tile.Model);
                    if (tgtTile != null)
                    {
                        var data = new EvTileMoveData();
                        data.Char = tgt;
                        data.Cost = 0;
                        data.DoAttackOfOpportunity = false;
                        data.StamCost = 0;
                        data.Source   = tgt.Tile;
                        data.Target   = tgtTile.Controller;
                        var e = new EvTileMove(data);
                        e.AddCallback(hit.CallbackHandler);
                        e.TryProcess();
                    }
                    else
                    {
                        hit.CallbackHandler(null);
                    }
                }
                else
                {
                    hit.CallbackHandler(null);
                }
            }
        }
예제 #3
0
        public override void Process(MHit hit)
        {
            if (hit.Data.Ability.Data.IsHeal)
            {
                // TODO:
            }
            else if (hit.Data.Ability.Data.ProcessDamage)
            {
                var src = hit.Data.Source.Proxy;
                var targetController = hit.Data.Target.Current as CChar;
                var tgt = targetController.Proxy;

                double dmgToApply    = this.GetCritDamage(hit, (double)hit.Data.Dmg);
                double dmgReduction  = tgt.GetStat(ESecondaryStat.Damage_Reduction);
                double flatDmgNegate = src.GetStat(ESecondaryStat.Damage_Ignore);

                if (FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Head))
                {
                    flatDmgNegate += this.GetArmorNegation(hit, src, tgt, flatDmgNegate, true);
                    dmgReduction   = this.GetDmgReduction(hit, src, tgt, dmgReduction, true);
                }
                else
                {
                    flatDmgNegate += this.GetArmorNegation(hit, src, tgt, flatDmgNegate, false);
                    dmgReduction   = this.GetDmgReduction(hit, src, tgt, dmgReduction, false);
                }
                dmgToApply  -= flatDmgNegate;
                dmgToApply  *= dmgReduction;
                hit.Data.Dmg = (int)dmgToApply;
            }
        }
예제 #4
0
        public void DoScatter(object o)
        {
            var hit = o as MHit;
            var tgt = hit.Data.Target.Current as CChar;

            if (tgt != null &&
                FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Push) &&
                !FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Dodge) &&
                !FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Parry))
            {
                CTile randomController = null;
                var   tgtTile          = hit.Data.Source.Tile.Model.GetPushTile(tgt.Tile.Model);
                if (tgtTile == null)
                {
                    randomController = hit.Data.Source.Tile.GetNearestEmptyTile();
                }
                if (randomController != null)
                {
                    tgtTile = randomController.Model;
                }
                if (tgtTile != null)
                {
                    var data = new EvTileMoveData();
                    data.Char = tgt;
                    data.Cost = 0;
                    data.DoAttackOfOpportunity = false;
                    data.StamCost = 0;
                    data.Source   = tgt.Tile;
                    data.Target   = tgtTile.Controller;
                    var e = new EvTileMove(data);
                    e.AddCallback(hit.CallbackHandler);
                    e.TryProcess();
                }
            }
        }
예제 #5
0
        public override void Process(MHit hit)
        {
            var roll = RNG.Instance.NextDouble();

            if (roll > LogicParams.BASE_HEAD_CHANCE)
            {
                FHit.SetHeadTrue(hit.Data.Flags);
            }
        }
예제 #6
0
        public override void Process(MHit hit)
        {
            this.Predict(hit);
            var roll = RNG.Instance.NextDouble();

            if (hit.Data.Chances.Parry > roll)
            {
                FHit.SetParryTrue(hit.Data.Flags);
            }
        }
예제 #7
0
 public override void Process(MHit hit)
 {
     this.Predict(hit);
     if (hit.Data.Ability.Data.Resist != EResistType.None)
     {
         var roll = RNG.Instance.NextDouble();
         if (roll < hit.Data.Chances.Resist)
         {
             FHit.SetResistTrue(hit.Data.Flags);
         }
     }
 }
예제 #8
0
        private double GetCritDamage(MHit hit, double dmgIn)
        {
            double dmgOut = dmgIn;

            if (FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Critical))
            {
                dmgOut *=
                    (LogicParams.BASE_CRIT_SCALAR +
                     (hit.Data.Source.Proxy.GetStat(ESecondaryStat.Critical_Multiplier) /
                      LogicParams.BASE_SCALAR));
            }
            return(dmgOut);
        }
예제 #9
0
        private bool IsHitFatal(MHit hit)
        {
            var target = hit.Data.Target.Current as CChar;

            if (target.Proxy.GetPoints(ESecondaryStat.HP) - hit.Data.Dmg <= 0)
            {
                if (!FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Dodge) &&
                    !FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Parry))
                {
                    return(true);
                }
            }
            return(false);
        }
예제 #10
0
 public override void TryProcessHit(MHit hit, bool prediction)
 {
     base.TryProcessHit(hit, prediction);
     if (base.CheckConditions(hit))
     {
         var calc    = new ResistCalculator();
         var tgt     = hit.Data.Target.Current as CChar;
         var offense = hit.Data.Source.Proxy.GetStat(this.Data.OffensiveResist);
         if (!prediction && !calc.DidResist(tgt, this.Data.Resist, offense))
         {
             FHit.SetPushTrue(hit.Data.Flags);
             tgt.Proxy.AddEffect(this);
         }
     }
 }
예제 #11
0
 private void HandleHitCounters()
 {
     foreach (var hit in this._data.Hits)
     {
         var target = hit.Data.Target.Current;
         if (target != null && target.GetType().Equals(typeof(CChar)))
         {
             var tgt = target as CChar;
             if (FActionStatus.HasFlag(tgt.Proxy.GetActionFlags().CurFlags, FActionStatus.Flags.Riposting))
             {
                 if (FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Block) ||
                     FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Dodge) ||
                     FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Parry))
                 {
                     this.HandleHitCounterHelper(hit, tgt);
                 }
             }
         }
     }
 }
예제 #12
0
 public override void TryProcessHit(MHit hit, bool prediction)
 {
     base.TryProcessHit(hit, prediction);
     if (base.CheckConditions(hit))
     {
         var calc    = new ResistCalculator();
         var tgt     = hit.Data.Target.Current as CChar;
         var offense = hit.Data.Source.Proxy.GetStat(this.Data.OffensiveResist);
         if (!prediction && !calc.DidResist(tgt, this.Data.Resist, offense))
         {
             FCharacterStatus.SetStunnedTrue(tgt.Proxy.GetStatusFlags());
             FHit.SetStunTrue(hit.Data.Flags);
             hit.AddEffect(this);
             tgt.Proxy.AddEffect(this);
         }
         else if (!prediction)
         {
             VCombatController.Instance.DisplayText("Resist", tgt, CombatGUIParams.WHITE);
         }
     }
 }
예제 #13
0
 public override void ProcessEnterZone(TileMoveData moveData)
 {
     this.FirstSpearWallHit = false;
     this.SpearWallHit      = false;
     base.ProcessEnterZone(moveData);
     if (this._spearWallData.Source != null)
     {
         if (moveData.Target.Proxy.LParty != this._spearWallData.Source.Proxy.LParty)
         {
             moveData.Callback(this);
             var data = new ActionData();
             data.Ability      = EAbility.Pierce;
             data.LWeapon      = this._spearWallData.LWeapon;
             data.ParentWeapon = this._spearWallData.ParentWeapon;
             data.Source       = this._spearWallData.Source;
             data.Target       = moveData.Target.Tile;
             data.WpnAbility   = true;
             this._action      = new MAction(data);
             this._action.AddCallback(moveData.ParentEvent.TryDone);
             moveData.ParentEvent.AddChildAction(this._action);
             var staminaCalc = new StaminaCalculator();
             var cost        = staminaCalc.Process(this._action);
             if (FActionStatus.HasFlag(this._action.Data.Source.Proxy.GetActionFlags().CurFlags, FActionStatus.Flags.Spearwalling) &&
                 cost <= this._action.Data.Source.Proxy.GetPoints(ESecondaryStat.Stamina))
             {
                 this._action.TryProcessNoDisplay();
                 foreach (var hit in this._action.Data.Hits)
                 {
                     if (!FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Block) &&
                         !FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Dodge) &&
                         !FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Parry))
                     {
                         this.SpearWallHit = true;
                     }
                 }
                 this.HandleSpeared(null);
             }
         }
     }
 }
예제 #14
0
        private void DisplayDamage(CChar target, MHit hit)
        {
            var dmgData = new HitDisplayData();

            dmgData.Color    = CombatGUIParams.RED;
            dmgData.Hit      = hit;
            dmgData.Priority = ViewParams.DMG_PRIORITY;
            dmgData.Text     = hit.Data.Dmg.ToString();
            dmgData.Target   = target.GameHandle;
            dmgData.YOffset  = CombatGUIParams.FLOAT_OFFSET;
            dmgData.Hit.AddDataDisplay(dmgData);
            if (FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Critical))
            {
                var critData = new HitDisplayData();
                critData.Color    = CombatGUIParams.RED;
                critData.Hit      = hit;
                critData.Priority = ViewParams.CRIT_PRIORITY;
                critData.Text     = "CRIT!";
                critData.Target   = target.GameHandle;
                critData.YOffset  = CombatGUIParams.FLOAT_OFFSET;
                critData.Hit.AddDataDisplay(critData);
            }
        }
예제 #15
0
 public void ModifyDmgViaDefender(MHit hit)
 {
     if (hit.Data.Ability.Data.IsHeal)
     {
         // TODO:
     }
     else if (!FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Dodge) &&
              !FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Parry))
     {
         if (FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Block))
         {
             this.ProcessShieldBlock(hit);
         }
         else
         {
             this.Process(hit);
         }
     }
     else
     {
         hit.Data.Dmg = 0;
     }
 }
예제 #16
0
 private void ProcessDefenderHitsHelper(CChar target, MHit hit)
 {
     if (hit.Data.IsHeal)
     {
         this.DisplayHeal(target, hit);
     }
     else if (hit.Data.Action.Data.DisplayDefended)
     {
         if (FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Dodge))
         {
             this.DisplayDodge(target, hit);
         }
         else if (FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Block))
         {
             this.DisplayBlock(target, hit);
         }
         else if (FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Parry))
         {
             this.DisplayParry(target, hit);
         }
         else
         {
             this.DisplayFlinch(target, hit);
         }
     }
     else if (!FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Block) &&
              !FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Dodge) &&
              !FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Parry))
     {
         this.DisplayFlinch(target, hit);
     }
     else
     {
         hit.CallbackHandler(this);
     }
 }
예제 #17
0
        private List <GameObject> GetEmbedBulletTargets(MHit hit)
        {
            var tgts = new List <GameObject>();

            if (hit.Data.Target.Current != null &&
                hit.Data.Target.Current.GetType().Equals(typeof(CChar)))
            {
                var tgt = hit.Data.Target.Current as CChar;
                if (FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Dodge))
                {
                    tgts.Add(tgt.Tile.Handle);
                }
                else if (FHit.HasFlag(hit.Data.Flags.CurFlags, FHit.Flags.Block))
                {
                    if (tgt.Proxy.GetLWeapon() != null &&
                        tgt.Proxy.GetLWeapon().IsTypeOfShield())
                    {
                        tgts.Add(tgt.SubComponents[SortingLayers.CHAR_L_WEAPON]);
                    }
                    if (tgt.Proxy.GetRWeapon() != null &&
                        tgt.Proxy.GetRWeapon().IsTypeOfShield())
                    {
                        tgts.Add(tgt.SubComponents[SortingLayers.CHAR_R_WEAPON]);
                    }
                }
                else
                {
                    if (tgt.Proxy.Type != ECharType.Critter)
                    {
                        if (tgt.SubComponents.ContainsKey(SortingLayers.CHAR_ARMOR))
                        {
                            tgts.Add(tgt.SubComponents[SortingLayers.CHAR_ARMOR]);
                        }
                        else
                        {
                            tgts.Add(tgt.SubComponents[SortingLayers.CHAR_TORSO]);
                        }
                        if (tgt.SubComponents.ContainsKey(SortingLayers.CHAR_HELM))
                        {
                            tgts.Add(tgt.SubComponents[SortingLayers.CHAR_HELM]);
                        }
                        else
                        {
                            tgts.Add(tgt.SubComponents[SortingLayers.CHAR_HEAD]);
                        }
                        if (tgt.SubComponents.ContainsKey(SortingLayers.CHAR_MOUNT))
                        {
                            tgts.Add(tgt.SubComponents[SortingLayers.CHAR_MOUNT]);
                        }
                    }
                    else
                    {
                        tgts.Add(tgt.SubComponents[SortingLayers.CHAR_MAIN]);
                    }
                }
            }
            else
            {
                tgts.Add(hit.Data.Target.Handle);
            }
            return(tgts);
        }