public void OnContinuePressed()
 {
     SingletonProvider.MainEventPublisher.Publish(EventType.CombatResultsClosed, new CombatResultsClosedEvent(result));
     SingletonProvider.MainPlayerWallet.AddGold(result.GainedGold);
     result = null;
     combatResultScreen.gameObject.SetActive(false);
 }
Esempio n. 2
0
 public void SetCombatResult(CombatResult player, CombatResult enemy)
 {
     _playerAttackResult.text  = player.AttackSum.ToString();
     _playerDefenseResult.text = player.DefenseSum.ToString();
     _enemyAttackResult.text   = enemy.AttackSum.ToString();
     _enemyDefenseResult.text  = enemy.DefenseSum.ToString();
 }
Esempio n. 3
0
    public virtual CombatResult Attack(ref ControlledDivision division, float distanceToTarget)
    {
        CombatResult result = new CombatResult();

        if (distanceToTarget < MinRange || distanceToTarget > MaxRange)
        {
            result.AttackSuccess = false;
            return(result);
        }

        result.Attacker = this;

        foreach (var defender in division.Soldiers)
        {
            if (defender.Health > 0)
            {
                result.DamageToDefender = DoDamage(this, defender);
                result.Defender         = defender;
                result.DamageToAttacker = defender.Defend(this, distanceToTarget);
                break;
            }
        }

        return(result);
    }
Esempio n. 4
0
        //public override CombatResult Resolve(CombatMove OpponentMove)
        //{
        //    return base.Resolve(OpponentMove);
        //}

        /// <summary>
        /// This Fighter BLOCKS, Opponent Fighter BLOCKS
        /// If either false blocked previously then
        /// cant block next turn
        /// </summary>
        /// <param name="thisFighterId"></param>
        /// <param name="opponentFighterId"></param>
        /// <returns></returns>
        protected override CombatResult resolve(List <CombatMove> Moves)
        {
            string thisFighterId     = Moves[0].FighterId;
            string opponentFighterId = Moves[1].FighterId;

            CombatResult combatResult = new CombatResult();
            string       comments     = "Both knights block.";

            //ICombatHistoryResolver successfulBlockHistoryResolver = new SuccessfulBlockHistoryResolver(_combatSession);
            ICombatHistoryResolver falseBlockHistoryResolver = new FalseBlockHistoryResolver(_combatSession);

            //int numTimesThisFighterHasBeenBlocked = numberPreviousSuccessfulBlocks(opponentFighterId, thisFighterId);
            //int numTimesOpponentFighterHasBeenBlocked = numberPreviousSuccessfulBlocks(thisFighterId, opponentFighterId);
            //int numTimesThisFighterHasBeenBlocked = numberPreviousSuccessfulBlocks(opponentFighterId);
            //int numTimesOpponentFighterHasBeenBlocked = numberPreviousSuccessfulBlocks(thisFighterId);
            int numTimesThisFighterHasFalseBlocked     = falseBlockHistoryResolver.Resolve(thisFighterId);
            int numTimesOpponentFighterHasFalseBlocked = falseBlockHistoryResolver.Resolve(opponentFighterId);

            //combatResult.CombatAnimationInstructions[thisFighterId].AnimCommand = AnimationCommands.AC_BLOCK;
            //combatResult.CombatAnimationInstructions[opponentFighterId].AnimCommand = AnimationCommands.AC_BLOCK;
            combatResult.CombatAnimationInstructions.Add(thisFighterId,
                                                         new CombatAnimationInstruction()
            {
                FighterID = thisFighterId, AnimCommand = AnimationCommands.AC_BLOCK
            });
            combatResult.CombatAnimationInstructions.Add(opponentFighterId,
                                                         new CombatAnimationInstruction()
            {
                FighterID = opponentFighterId, AnimCommand = AnimationCommands.AC_BLOCK
            });

            if (numTimesThisFighterHasFalseBlocked > 0)
            {
                comments = comments + string.Format(" {0} false blocked previoulsy, cannot block next turn. ", thisFighterId);
                //combatResult.ShieldTaunt.Add(opponentFighterId);
                //This Fighter cant block next turn
                combatResult.MoveRestrictions.Add(new KeyValuePair <string, CombatActions>(thisFighterId, CombatActions.BLOCK));
                //So Opponent Fighter cant swing either
                //combatResult.MoveRestrictions.Add(new KeyValuePair<string, CombatActions>(opponentFighterId, CombatActions.SWING));
            }

            if (numTimesOpponentFighterHasFalseBlocked > 0)
            {
                comments = comments + string.Format(" {0} false blocked previoulsy, cannot block next turn. ", opponentFighterId);
                //combatResult.ShieldTaunt.Add(thisFighterId);
                //Opponent Fighter cant block next turn
                combatResult.MoveRestrictions.Add(new KeyValuePair <string, CombatActions>(opponentFighterId, CombatActions.BLOCK));
                //So This Fighter cant block either
                //combatResult.MoveRestrictions.Add(new KeyValuePair<string, CombatActions>(thisFighterId, CombatActions.BLOCK));
            }

            //combatResult.TotalRunningHPs[thisFighterId] = totalHPs(thisFighterId);
            //combatResult.TotalRunningHPs[opponentFighterId] = totalHPs(opponentFighterId);
            combatResult.TotalRunningHPs.Add(thisFighterId, totalHPs(thisFighterId));
            combatResult.TotalRunningHPs.Add(opponentFighterId, totalHPs(opponentFighterId));

            combatResult.Comments = comments;

            return(combatResult);
        }
Esempio n. 5
0
        public CombatResult CalculateAverageDamage(Force myForce, Force enemyForce, List<Effect> boosts, bool vsEpic = true)
        {
            EnsureEffectProcs();

            var result = new CombatResult();
            foreach (var effect in Effects)
            {
                result.Add(effect.CalculateAverageDamage(myForce, enemyForce, boosts, vsEpic));
            }

            // Apply Rally Effects - Rally will only work once for each ability and will affect abilities which deal no damage
            if (boosts != null)
            {
                foreach (var rallyEffect in boosts.Where(x => x.Type == EffectType.Rally))
                {
                    var abilBonus = rallyEffect.ParentAbilityProcChance*rallyEffect.EffectValue*this.ProcChance;
                    if (HasEffect(EffectType.FlurryDamage))
                    {
                        var baseBonus = abilBonus;
                        abilBonus = 0;
                        foreach (var effect in GetEffects(EffectType.FlurryDamage))
                        {
                            abilBonus += baseBonus*effect.EffectValue;
                        }
                    }
                    result.Damage += abilBonus;
                }
            }

            return result;
        }
Esempio n. 6
0
    private void CombatCheckout(CombatResult combatResult)
    {
        string msg = "";

        if (combatResult.WinnerId == MatchSystem.instance.selfId)
        {
            msg = "我是冠军";
        }
        else
        {
            msg = "你输了";
        }
        var go  = CanvasManager.instance.CreatePanel(CanvasManager.PanelLevelType.Top, "System/PnlComfirmView");
        var wnd = go.GetComponent <ConfirmView>();

        wnd.SetLogMessage(msg);
        wnd.onConfirm.AddListener(() =>
        {
            foreach (var pair in m_States)
            {
                var state = pair.Value;
                state.ReleaseResource();
            }
            SceneManager.LoadScene((Int32)GameConst.SceneType.Player);
        });
    }
Esempio n. 7
0
        public object[] ReflectiveWard(CombatResult owner, CombatResult target)
        {
            if (target.SentHit)
            {
                if (Program.Chance(tier))
                {
                    long totalDamage = 0;
                    for (int i = 0; i < target.baseDamage.Length; i++)
                    {
                        totalDamage += NumbersM.FloorParse <long>
                                           ((target.baseDamage[i]
                                             + target.bonusDamage[i]) *
                                           target.damageMultiplier[i]);

                        target.damageMultiplier[i] = 0;
                    }
                    long returned = NumbersM.FloorParse <long>(totalDamage *
                                                               (5.00 + tier) / 100);
                    target.character.TakeDamage(returned);
                    owner.perkProcs.Add($"Returned {returned} damage to {target.Name}");
                }
            }

            return(R(owner, target));
        }
Esempio n. 8
0
    public void OnCombatResult(CombatResult result)
    {
        this.CurrentLifeForce -= result.UsedLifeForce;

        if (!result.DefenseWon)
        {
            this.Health -= result.LifeDamage;
            if (this.Health <= 0)
            {
                this.TransferAllLifeForceTo(result.OpponentLifeForce.GetComponent <ILife>());
            }
        }
        else
        {
            if (this.CurrentLifeForce <= this.MaxLifeForceUsage)
            {
                RunAway();
            }
        }

        Transform spell = Instantiate(_lifeForceBallPrefab, this.transform.position, Quaternion.identity).transform;

        spell.GetComponent <SpellFollowTarget>().Cast(result.OpponentLifeForce.transform);
        spell.transform.parent = GameObject.Find("=== spells ===").transform;
    }
Esempio n. 9
0
        private void DisplayPostCombatPopup(CombatResult result)
        {
            var popup = FindObjectOfType <PostCombatResultsPopup>();

            popup.Show(result);

            _eventMediator.Broadcast(CombatFinished, this);
        }
Esempio n. 10
0
 public object[] CleanSlate(CombatResult owner)
 {
     if (owner.character.status.Count == 0)
     {
         owner.character.StaminaE(0.05);
     }
     return(new object[] { owner });
 }
 void OnEvent(IEvent e)
 {
     if (e is CombatEndedEvent combatEnded)
     {
         combatResultScreen.gameObject.SetActive(true);
         combatResultScreen.SetCombatResult(combatEnded.Result);
         result = combatEnded.Result;
     }
 }
Esempio n. 12
0
        public object[] HunterTrap_End(CombatResult owner)
        {
            if (rank < 5)
            {
                rank++;
            }

            return(new object[] { owner });
        }
        public object[] Paralysis(CombatResult owner)
        {
            if (owner.action == CombatResult.Action.Cast && Program.Chance(tier))
            {
                owner.action = CombatResult.Action.Paralyzed;
            }

            return(TurnPassed(owner));
        }
Esempio n. 14
0
 public void AddResult(CombatResult res)
 {
     if (res == CombatResult.Win)
         Wins++;
     else if (res == CombatResult.Lose)
         Losses++;
     else
         Draws++;
 }
Esempio n. 15
0
 public object[] Underestimated(CombatResult owner, CombatResult enemy)
 {
     if (owner.character.level < enemy.character.level ||
         owner.character.Rank() < enemy.character.Rank())
     {
         owner.damageMultiplier = ArrayM.AddEach(owner.damageMultiplier, 0.1);
     }
     return(new object[] { owner, enemy });
 }
Esempio n. 16
0
 public object[] Opportunist(CombatResult owner, CombatResult enemy)
 {
     if (enemy.character.status.Count > 0)
     {
         owner.damageMultiplier = ArrayM.AddEach(owner.damageMultiplier,
                                                 0.01 * enemy.character.status.Count);
     }
     return(new object[] { owner, enemy });
 }
Esempio n. 17
0
 public static void Reflect(CombatResult caster, CombatResult target)
 {
     if (caster.SentHit)
     {
         Ability reflect = caster.abilityUsed;
         target.character.Status(reflect.statusEffect,
                                 3 + (reflect.level / 5), reflect.level);
         caster.perkProcs.Add($"Applied {reflect.statusEffect} to {target.Name}");
     }
 }
Esempio n. 18
0
 public static void KeenEye(CombatResult caster, CombatResult target)
 {
     if (caster.SentHit)
     {
         Ability keeneye = caster.abilityUsed;
         target.character.Status(keeneye.statusEffect, 5 + (keeneye.level / 10),
                                 5 + (keeneye.level / 10));
         caster.perkProcs.Add($"Applied {keeneye.statusEffect} to {target.Name}");
     }
 }
Esempio n. 19
0
        public object[] Vengeful(CombatResult owner)
        {
            double per = (owner.character.health / owner.character.Health()) - 0.35;

            if (per > 0)
            {
                owner.damageMultiplier = ArrayM.AddEach(owner.damageMultiplier, per);
            }
            return(R(owner));
        }
Esempio n. 20
0
 public static void WhiteBite(CombatResult caster, CombatResult target)
 {
     if (caster.SentHit)
     {
         Ability ability = caster.abilityUsed;
         target.character.Status(ability.statusEffect ?? "Energy Leak", 3 + (ability.level / 3),
                                 ability.level);
         caster.perkProcs.Add($"{caster.Name} applied Energy Leak to {target.Name}");
     }
 }
Esempio n. 21
0
 public static void CounterPrep(CombatResult caster, CombatResult target)
 {
     if (caster.SentHit)
     {
         Ability counterPrep = caster.abilityUsed;
         target.character.Status(counterPrep.statusEffect ?? "Patient Requite", counterPrep.level,
                                 counterPrep.level);
         caster.perkProcs.Add($"Applied Patient Requite to {target.Name}");
     }
 }
Esempio n. 22
0
    public void ReceiveCombatResult(CombatResult combatResult)
    {
        mCombatReceiverModel.AlterHealthPoints(-combatResult.DamageToReceiver);

        // Monitor health for killing actor.
        if (mCombatReceiverModel.HealthPoints <= 0)
        {
            mCombatReceiverModel.MarkedForDeath = true;
        }
    }
Esempio n. 23
0
    public void ReceiveCombatResult(CombatResult combatResult)
    {
        mCombatReceiverModel.AlterHealthPoints(-combatResult.DamageToReceiver);

        // Monitor health for killing actor.
        if (mCombatReceiverModel.HealthPoints <= 0)
        {
            mCombatReceiverModel.MarkedForDeath = true;
        }
    }
Esempio n. 24
0
 /// <summary>
 /// 战斗结束
 /// </summary>
 void CombatComplete(CombatResult result)
 {
     if (state == State.Combating)
     {
         state = State.CombatComplete;
         GameEvent.TurnBaseEvent.FireOnCombatComplete(curTurnBase, result);
         curTurnBase  = null;
         nextTurnBase = null;
     }
 }
Esempio n. 25
0
        /// <summary>
        /// Enter Combat mode.
        /// </summary>
        /// <param name="parts">Command as typed by the user split into individual words.</param>
        private static void ProcessFightCommand(string[] parts)
        {
            Creature creature;

            try
            {
                creature = CurrentArea.GetCreature(parts[1]);
            }
            catch (WorldException e)
            {
                if (CurrentArea.HasItem(parts[1]))
                {
                    PrintLineWarning("You can't fight with that...");
                }
                else
                {
                    PrintLineDanger(e.Message);
                }
                return;
            }

            // This method is part of the MainClass but is defined in a different file.
            // Check out the Combat.cs file.
            CombatResult result = DoCombat(creature);

            switch (result)
            {
            case CombatResult.Win:
                PrintLinePositive("You win!");
                Player.Stats.Exp += creature.Stats.Exp;
                CurrentArea.RemoveCreature(parts[1]);
                // TODO: Part of a larger achievement
                // After you gain Exp, how do you improve your stats?
                // there should be some rules to how this works.
                // But, you are the god of this universe.  You make the rules.

                // TODO: Part of a larger achievement
                // After defeating an Enemy, they should drop their Inventory
                // into the CurrentArea so that the player can then PickUp those Items.
                break;

            case CombatResult.Lose:
                PrintLineDanger("You lose!");
                // TODO:  Easy Achievement:
                // What happens when you die?  Deep questions.
                break;

            case CombatResult.RunAway:
                // TODO: Moderate Achievement
                // Handle running away.  What happens if you run from a battle?
                break;

            default: break;
            }
        }
Esempio n. 26
0
        public static void SpiritRip(CombatResult caster, CombatResult target)
        {
            Ability ability = caster.abilityUsed;

            if (caster.SentHit && Program.Chance(38 + ability.level))
            {
                target.character.Status(ability.statusEffect ?? "Energy Leak", ability.level,
                                        ability.level + 10);
                caster.perkProcs.Add($"{caster.Name} applied Energy Leak to {target.Name}");
            }
        }
Esempio n. 27
0
        public static void ToxicStrike(CombatResult caster, CombatResult target)
        {
            Ability toxicStrike = caster.abilityUsed;

            if (caster.SentHit && Program.Chance(10 + toxicStrike.level))
            {
                target.character.Status(toxicStrike.statusEffect ?? "Poisoned", 6,
                                        (int)Verify.Min(caster.character.TotalBaseDamage() / 10, 2));
                caster.perkProcs.Add($"Applied Poisoned > {target.Name}");
            }
        }
Esempio n. 28
0
        //public override CombatResult Resolve(CombatMove OpponentMove)
        //{
        //    return base.Resolve(OpponentMove);
        //}

        /// <summary>
        /// This Fighter BLOCKS, Opponent Fighter RESTS
        /// If This Fighter false blocked previously then
        /// cant block next turn.
        /// Opponent Fighter heals
        /// </summary>
        /// <param name="thisFighterId"></param>
        /// <param name="opponentFighterId"></param>
        /// <returns></returns>
        protected override CombatResult resolve(List <CombatMove> Moves)
        {
            string blockingFighterId = Moves.Where(x => x.Action == CombatActions.BLOCK).FirstOrDefault().FighterId;
            string restingFighterId  = Moves.Where(x => x.Action == CombatActions.REST).FirstOrDefault().FighterId;

            CombatResult combatResult = new CombatResult();
            string       comments     = "Player heals.";

            ICombatHistoryResolver falseBlockHistoryResolver = new FalseBlockHistoryResolver(_combatSession);

            //get count of how may times This Fighter has been previously false blocked
            //int previousFalseBlocks = numberPreviousFalseBlocks(thisFighterId, opponentFighterId);
            //int previousFalseBlocks = numberPreviousFalseBlocks(thisFighterId);
            int previousFalseBlocks = falseBlockHistoryResolver.Resolve(blockingFighterId);

            if (previousFalseBlocks > 0)
            {
                combatResult.MoveRestrictions.Add(new KeyValuePair <string, CombatActions>(blockingFighterId, CombatActions.BLOCK));
                comments = string.Format("{0} false blocks and cannot block next turn", blockingFighterId);
            }

            //get count of how may times Opponent Fighter has previously healed
            //int previousHeals = numberPreviousSuccessfulHeals(opponentFighterId, thisFighterId);
            //int previousHeals = numberPreviousSuccessfulHeals(opponentFighterId);
            SuccessfulHealHistoryResolver successfulHealHistoryResolver = new SuccessfulHealHistoryResolver(_combatSession);
            int previousHeals = successfulHealHistoryResolver.Resolve(restingFighterId);

            //combatResult.CombatAnimationInstructions[thisFighterId].AnimCommand = AnimationCommands.AC_BLOCK;
            //combatResult.CombatAnimationInstructions[opponentFighterId].AnimCommand = AnimationCommands.AC_HEAL;
            combatResult.CombatAnimationInstructions.Add(blockingFighterId, new CombatAnimationInstruction()
            {
                FighterID = blockingFighterId, AnimCommand = AnimationCommands.AC_BLOCK
            });
            combatResult.CombatAnimationInstructions.Add(restingFighterId, new CombatAnimationInstruction()
            {
                FighterID = restingFighterId, AnimCommand = AnimationCommands.AC_HEAL
            });


            //damage is base 2 plus previous consecutive hits
            int totalHealing = 1 + previousHeals;

            //combatResult.HPAdjustments[opponentFighterId] = totalHealing;
            combatResult.HPAdjustments.Add(restingFighterId, totalHealing);

            //combatResult.TotalRunningHPs[opponentFighterId] = totalHPs(opponentFighterId) + totalHealing;
            //combatResult.TotalRunningHPs[thisFighterId] = totalHPs(thisFighterId);
            combatResult.TotalRunningHPs.Add(restingFighterId, totalHPs(restingFighterId) + totalHealing);
            combatResult.TotalRunningHPs.Add(blockingFighterId, totalHPs(blockingFighterId));

            combatResult.Comments = comments;

            return(combatResult);
        }
Esempio n. 29
0
        public static void Taunt(CombatResult caster, CombatResult target)
        {
            if (caster.SentHit)
            {
                Ability ability = caster.abilityUsed;
                //Add agrro mechanics TODO

                caster.character.StaminaE(100);
                target.perkProcs.Add($"Was taunted by {caster.Name}!");
            }
        }
Esempio n. 30
0
 public static void Vivace(CombatResult caster, CombatResult target)
 {
     if (caster.SentHit)
     {
         Ability vivace         = caster.abilityUsed;
         int     staminaDrained = Verify.Max(2 * vivace.level,
                                             target.character.stamina);
         target.character.StaminaE(-staminaDrained);
         caster.character.StaminaE(staminaDrained);
         caster.perkProcs.Add($"{caster.Name} drained {staminaDrained}SP from {target.Name}");
     }
 }
Esempio n. 31
0
        //public override CombatResult Resolve(CombatMove OpponentMove)
        //{
        //    return base.Resolve(OpponentMove);
        //}

        /// <summary>
        /// This Fighter SWINGS, Opponent Fighter BLOCKS
        /// If This Fighter has been blocked previously then
        /// he cant swing again next turn
        /// </summary>
        /// <param name="thisFighterId"></param>
        /// <param name="opponentFighterId"></param>
        /// <returns></returns>
        protected override CombatResult resolve(List <CombatMove> Moves)
        {
            string swingingFighterId = Moves.Where(x => x.Action == CombatActions.SWING).FirstOrDefault().FighterId;
            string blockingFighterId = Moves.Where(x => x.Action == CombatActions.BLOCK).FirstOrDefault().FighterId;

            CombatResult           combatResult = new CombatResult();
            ICombatHistoryResolver successfulBlockHistoryResolver = new SuccessfulBlockHistoryResolver(_combatSession);

            string comments;

            //get count of how may times Opponent Fighter has previously been blocked (consecutively)
            //int numberPreviousTimesBlocked = numberPreviousSuccessfulBlocks(thisFighterId, opponentFighterId);
            //int numberPreviousTimesBlocked = numberPreviousSuccessfulBlocks(thisFighterId);
            //int numberPreviousTimesBlocked = successfulBlockHistoryResolver.Resolve(swingingFighterId);
            int numberPreviousTimesBlocked = successfulBlockHistoryResolver.Resolve(blockingFighterId);

            //combatResult.CombatAnimationInstructions[thisFighterId].AnimCommand = AnimationCommands.AC_SWING;
            //combatResult.CombatAnimationInstructions[opponentFighterId].AnimCommand = AnimationCommands.AC_BLOCK;
            combatResult.CombatAnimationInstructions.Add(swingingFighterId, new CombatAnimationInstruction()
            {
                FighterID = swingingFighterId, AnimCommand = AnimationCommands.AC_SWING
            });
            combatResult.CombatAnimationInstructions.Add(blockingFighterId, new CombatAnimationInstruction()
            {
                FighterID = blockingFighterId, AnimCommand = AnimationCommands.AC_BLOCK
            });

            //add flag to signal recoil animation
            combatResult.ShieldRecoil.Add(blockingFighterId);

            comments = string.Format("{0} blocks.", blockingFighterId);

            //If This Player was blocked previously then trigger taunting animation and restrict next move:
            if (numberPreviousTimesBlocked >= 1)
            {
                combatResult.ShieldTaunt.Add(blockingFighterId);
                //This Player cant swing next turn
                combatResult.MoveRestrictions.Add(new KeyValuePair <string, CombatActions>(swingingFighterId, CombatActions.SWING));
                //So opponent cant block
                combatResult.MoveRestrictions.Add(new KeyValuePair <string, CombatActions>(blockingFighterId, CombatActions.BLOCK));

                comments = comments + string.Format(" {0} cannot swing next turn, so {1} cannot use shield", swingingFighterId, blockingFighterId);
            }

            //combatResult.TotalRunningHPs[thisFighterId] = totalHPs(thisFighterId);
            //combatResult.TotalRunningHPs[opponentFighterId] = totalHPs(opponentFighterId);
            combatResult.TotalRunningHPs.Add(swingingFighterId, totalHPs(swingingFighterId));
            combatResult.TotalRunningHPs.Add(blockingFighterId, totalHPs(blockingFighterId));

            combatResult.Comments = comments;

            return(combatResult);
        }
Esempio n. 32
0
        public static void Blunt(CombatResult caster, CombatResult target)
        {
            Ability sunder = caster.abilityUsed;

            if (caster.SentHit && (35 + sunder.level) <= Program.rng.Next(101))
            {
                if (target.character.Status(sunder.statusEffect, 3 + (sunder.level / 5), 10 + sunder.level) == 1)
                {
                    caster.perkProcs.Add($"{caster.Name} {sunder.statusEffect} {target.Name}");
                }
            }
        }
Esempio n. 33
0
        public CombatResult CalculateAverageDamage(Force myForce, Force enemyForce, bool vsEpic = true)
        {
            var result = new CombatResult();

            foreach (var ability in Abilities)
            {
                // Formations can never recieve Boosts
                result.Add(ability.CalculateAverageDamage(myForce, enemyForce, null, vsEpic));
            }

            return result;
        }
Esempio n. 34
0
    public void NewBrokenShield(Vector3 position)
    {
        GameObject obj = m_brokenShields.GetPooledObject();

        if (obj != null)
        {
            obj.transform.position = position;
            CombatResult newBrokenShield = new CombatResult();
            newBrokenShield.obj  = obj;
            newBrokenShield.time = 3.0f;
            m_activeBrokenShields.Add(newBrokenShield);
        }
    }
Esempio n. 35
0
        public CombatResult CalculateAverageDamage(Force myForce, Force enemyForce, List<Effect> boosts, bool vsEpic = true)
        {
            var result = new CombatResult();

            var useableBoosts = new List<Effect>();
            if(boosts != null)
            {
                useableBoosts.AddRange(boosts.Where(effect => effect.IsBoostEffect() && this.IsClassification(effect.TargetType)).ToList());
            }
            foreach (var ability in Abilities)
            {
                result.Add(ability.CalculateAverageDamage(myForce, enemyForce, useableBoosts, vsEpic));
            }

            return result;
        }
Esempio n. 36
0
    // This is the main controller for combat.  It arbitrates the interaction, records what took place
    // into a combat result, and sends out a message to both parties about the combat result.
    public static void ResolveAttackCollision(CombatAttackModel attack, CombatReceiverModel receiver)
    {
        CombatResult result;

        result = new CombatResult();
        // Record models
        result.Attack = attack;
        result.Receiver = receiver;

        result.DamageToReceiver = attack.Damage;

        result.DamageToAttacker = receiver.DamageToAttackerOnHit;

        if (receiver.AllowColorLeech)
        {
            result.ColorChangeAttacker = DetermineColorLeech(attack, receiver, result.DamageToReceiver/receiver.InitialHealthPoints);
        }
        else
        {
            result.ColorChangeAttacker = Vector3.zero;
        }

        // Determine if attack will kill the receiver.
        if ( (receiver.HealthPoints - result.DamageToReceiver) <= 0)
        {
            result.DamageToAttacker += receiver.DamageToAttackerOnKill;
        }
        // Send result back to the receiver.
        receiver.SendMessage("ReceiveCombatResult", result, SendMessageOptions.DontRequireReceiver);
        attack.SendMessage("AttackCombatResult", result, SendMessageOptions.DontRequireReceiver);
        // Inform the owner of the attack success.
        if (attack.Owner)
        {
            attack.Owner.SendMessage("AttackCombatResult", result, SendMessageOptions.DontRequireReceiver);
        }
    }
Esempio n. 37
0
 public void AttackCombatResult(CombatResult combatResult)
 {
     AlterColor(combatResult.ColorChangeAttacker);
 }
Esempio n. 38
0
        /// <summary>
        /// Computes a fight between the currently selected unit
        /// and the best one from the selected destination.
        /// </summary>
        /// <param name="unit">The unit who fight.</param>
        /// <returns>A constant from the CombatResult enumeration to describe the result.</returns>
        private CombatResult Combat(IUnit unit)
        {
            IUnit enemy = GetBestUnit();

            Random randCombat = new Random();
            Random rand = new Random();

            int nbRound = 3 + randCombat.Next((Math.Max(unit.LifePoints, enemy.LifePoints)) + 2);
            int n = 0;

            while(nbRound > n && unit.IsAlive() && enemy.IsAlive()) {
                double ratioLife = (double)unit.LifePoints / (double)unit.DefaultLifePoints;
                double ratioLifeDef = (double)enemy.LifePoints / (double)enemy.DefaultLifePoints;
                double attaUnit = (double)unit.Attack * (double)ratioLife;
                double defUnitdef = (double)enemy.Defense * (double)ratioLifeDef;
                double ratioAttDef = (double)(attaUnit / defUnitdef);
                double ratioChanceDef = 0;
                if(ratioAttDef > 1) {
                    // Advantage for the attacker.
                    ratioChanceDef = (1 / ratioAttDef) / 2;
                    ratioChanceDef = (0.5 - ratioChanceDef) + 0.5;
                } else if(ratioAttDef == 1) {
                    // Draw: 50% chances to win.
                    ratioChanceDef = 0.5;
                } else {
                    // Advantage for the defender.
                    ratioChanceDef = ratioAttDef / 2;
                }
                double ratioCombat = (double)((double)rand.Next(100) / 100);

                if(ratioCombat <= ratioChanceDef) {
                    enemy.DecreaseLifePoints();
                } else {
                    unit.DecreaseLifePoints();
                }
                n++;
            }

            // Computes the result of the fight:
            if(!unit.IsAlive()) {
                this.game.Map.RemoveUnit(unit, this.selectedPosition);
                this.lastMoveInfo = this.player.Name + " lost the fight.";
                this.lastCombatResult = CombatResult.LOSE;
            } else if(!enemy.IsAlive()) {
                this.game.Map.RemoveUnit(enemy, this.destination);
                this.lastMoveInfo = this.player.Name + " won the fight.";
                this.lastCombatResult = CombatResult.WIN;
            } else {
                this.lastMoveInfo = "The fight ended with a draw";
                this.lastCombatResult = CombatResult.DRAW;
            }
            return this.lastCombatResult;
        }
Esempio n. 39
0
        public CombatResult CalculateTotalDamageContribution(Guid claimerID, Force myForce, Force enemyForce, List<Effect> boosts, bool vsEpic = true)
        {
            var result = new CombatResult();

            result.Add(this.CalculateAverageDamage(myForce, enemyForce, boosts, vsEpic));
            result.Add(this.CalculateReinforcedDamage(claimerID, myForce, enemyForce, boosts, vsEpic));

            return result;
        }
Esempio n. 40
0
        public CombatResult CalculateReinforcedDamage(Guid claimerID, Force myForce, Force enemyForce, List<Effect> boosts, bool vsEpic = true)
        {
            EnsureEffectProcs();

            var result = new CombatResult();

            if (HasEffect(EffectType.Reinforce) == false)
            {
                return result;
            }

            foreach (var effect in GetEffects(EffectType.Reinforce))
            {
                result.Add(effect.CalculateReinforcedDamage(claimerID, myForce, enemyForce, boosts, vsEpic));
            }

            return result;
        }
Esempio n. 41
0
 private static void ExitCombat()
 {
     try
     {
         _combatLoopThread.Abort();
     }
     catch
     {
     }
     try
     {
         _combatThread.Abort();
     }
     catch
     {
     }
     MoveHelper.ReleaseKeys();
     if (_combatResult == CombatResult.OtherPlayerTag)
     {
         PBlackList.Blacklist(Unit, 1200, false);
     }
     if (_combatResult == CombatResult.Bugged && ObjectManager.MyPlayer.HasLivePet)
     {
         KeyHelper.SendKey("PetFollow");
     }
     if (Unit.IsDead)
     {
         _combatResult = CombatResult.Success;
     }
     if (!ObjectManager.MyPlayer.IsAlive)
     {
         _combatResult = CombatResult.Died;
     }
     Logging.Write("Combat done, result : " + _combatResult);
     InvokeCombatStatusChanged(new GCombatEventArgs(CombatType.CombatDone, Unit));
     CombatDone();
     try
     {
         Stop();
     }
     catch
     {
     }
 }
Esempio n. 42
0
        internal static void StartCombat(PUnit u)
        {
            if (ObjectManager.MyPlayer.IsDead)
            {
                Stop();
                return;
            }
            Unit.BaseAddress = u.BaseAddress;
            InvokeCombatStatusChanged(new GCombatEventArgs(CombatType.CombatStarted));
            _combatThread = new Thread(CombatThread) {IsBackground = true};
            _combatThread.Name = "CombatThread";
            _combatThread.Start();
            _combatResult = CombatResult.Unknown;
            while (_combatThread.IsAlive)
            {
                try
                {
                    if (Unit.IsDead)
                    {
                        _combatResult = CombatResult.Success;
                        break;
                    }

                    if (!Unit.IsValid || PBlackList.IsBlacklisted(Unit))
                    {
                        if (!Langs.TrainingDummy(ObjectManager.MyPlayer.Target.Name))
                        {
                            _combatResult = CombatResult.Bugged;
                            break;
                        }
                    }

                    if (ObjectManager.MyPlayer.IsDead)
                    {
                        _combatResult = CombatResult.Died;
                        break;
                    }

                    if (Unit.IsPet || Unit.IsTotem)
                    {
                        Logging.Write("We are attacking a totem or a pet... doh");
                        _combatResult = CombatResult.Bugged;
                        break;
                    }

                    if (!Langs.TrainingDummy(Unit.Name) && Unit.IsTagged && !Unit.IsTaggedByMe && !Unit.IsTargetingMe &&
                        Unit != ObjectManager.MyPlayer)
                    {
                        Logging.Write("Other player tag");
                        _combatResult = CombatResult.OtherPlayerTag;
                        break;
                    }
                }
                catch (Exception e)
                {
                    Logging.Write("Exeption in combat handler: " + e);
                }
                Thread.Sleep(160);
            }
            ExitCombat();
        }
Esempio n. 43
0
 private static void CombatThread()
 {
     try
     {
         Logging.Write("Started combat engine");
         if (ObjectManager.MyPlayer.IsMounted && !ObjectManager.MyPlayer.TravelForm)
             KeyHelper.SendKey("GMount");
         MoveHelper.ReleaseKeys();
         if (DefendAgainst() == null)
         {
             Logging.Write("Pulling: " + Unit.Name + " " + Unit.GUID);
             MoveHelper.MoveToUnit(Unit, 30);
             if (!Unit.TargetHostile())
             {
                 if (ObjectManager.GetAttackers.Count == 0)
                     PPullBlackList.Blacklist(Unit, 800, true);
             }
             Unit.Face();
             MoveHelper.ReleaseKeys();
             PullResult result = Pull();
             Logging.Write("Pull result: " + result);
             if (result.Equals(PullResult.CouldNotPull))
             {
                 PPullBlackList.Blacklist(Unit, 800, true);
                 return;
             }
             if (PPullBlackList.IsBlacklisted(Unit))
             {
                 return;
             }
         }
         else
         {
             Logging.Write("Got into combat with: " + Unit.Name);
             Unit.TargetHostile();
             Unit.Face();
         }
         Ticker combatTimeout;
         if (ObjectManager.MyPlayer.Level > 10)
         {
             combatTimeout = new Ticker(20*1000);
         }
         else
         {
             combatTimeout = new Ticker(40*1000);
         }
         while (!Unit.IsDead)
         {
             _combatLoopThread = new Thread(DoCombat) {IsBackground = true};
             _combatLoopThread.Name = "DoCombat";
             _combatLoopThread.SetApartmentState(ApartmentState.STA);
             _combatLoopThread.Start();
             while (_combatLoopThread.IsAlive)
             {
                 Thread.Sleep(50);
                 if (!Langs.TrainingDummy(Unit.Name) && combatTimeout.IsReady && Unit.Health > 85)
                 {
                     Logging.Write("Combat took to long, bugged - blacklisting");
                     _combatResult = CombatResult.Bugged;
                     if (!PBlackList.IsBlacklisted(Unit))
                         PBlackList.Blacklist(Unit, 1200, false);
                     return;
                 }
             }
         }
     }
     catch
     {
     }
 }
Esempio n. 44
0
        public CombatResult CalculateAverageForceDamage(Force enemy)
        {
            var total = new CombatResult();
            foreach (var unit in GetUnits())
            {
                total.Add(unit.CalculateTotalDamageContribution(this, enemy, this.GetBoostAbilities(), enemy.IsEpicBoss));
            }

            return total;
        }
Esempio n. 45
0
        public CombatResult CalculateReinforcedDamage(Force myForce, Force enemyForce, List<Effect> boosts, bool vsEpic = true)
        {
            var result = new CombatResult();

            foreach (var ability in Abilities.Where(x => x.HasEffect(EffectType.Reinforce)))
            {
                result.Add(ability.CalculateReinforcedDamage(this.ID, myForce, enemyForce, boosts, vsEpic));
            }

            return result;
        }
Esempio n. 46
0
 public void AttackCombatResult(CombatResult combatResult)
 {
     mCombatReceiverModel.AlterHealthPoints(-combatResult.DamageToAttacker);
 }
Esempio n. 47
0
        // boosts is populated with only effects that can boost the source abilities unit
        public CombatResult CalculateAverageDamage(Force myForce, Force enemyForce, List<Effect> boosts, bool vsEpic = true)
        {
            var result = new CombatResult();

            if (VsEpicOnly && (vsEpic == false))
            {
                return result;
            }

            var min = Min + (vsEpic ? MinBonusVsEpic : 0);
            var max = Max + (vsEpic ? MaxBonusVsEpic : 0);
            var avg = ((min + max)/2.0);
            if (IsDamageEffect())
            {
                if (Type == EffectType.FlurryDamage)
                {
                    avg *= EffectValue;
                }
                if (Type == EffectType.ConditionalDamage && enemyForce != null)
                {
                    avg *= enemyForce.AvgNumOfUnitTypeAfterReinforcements(TargetType);
                }

                result.Damage += (avg*ParentAbilityProcChance);

                // Apply Percentile Boosts
                if (boosts != null)
                {
                    foreach (var boostEffect in boosts.Where(x => x.Type == EffectType.Boost))
                    {
                        var boostBonus = 1 + (boostEffect.ParentAbilityProcChance*(boostEffect.EffectValue*0.01));
                        result.Damage *= boostBonus;
                    }
                }
            }
            if (IsHealingEffect())
            {
                if (Type == EffectType.ConditionalHeal && myForce != null)
                {
                    avg *= myForce.AvgNumOfUnitTypeAfterReinforcements(TargetType);
                }

                result.Healing += (avg*ParentAbilityProcChance);
            }
            if (Type == EffectType.AntiHeal)
            {
                result.AntiHeal += (avg*ParentAbilityProcChance);
            }

            return result;
        }
Esempio n. 48
0
        public CombatResult CalculateReinforcedDamage(Guid claimerID, Force myForce, Force enemyForce, List<Effect> boosts, bool vsEpic)
        {
            var result = new CombatResult();

            foreach (var unit in myForce.ClaimReinforcements(claimerID, TargetType, EffectValue))
            {
                // Add each reinforced units total average damage potential (including reinforcements it might bring in too)
                var baseDamage = unit.CalculateTotalDamageContribution(myForce, enemyForce, boosts, vsEpic);
                result.Add(baseDamage.AdjustToProcChance(ParentAbilityProcChance));
            }

            return result;
        }