示例#1
0
        public void Handle(ImpactEvent arg)
        {
            if (arg.Hit <= 0 || (!_allowPlayerConfusion && arg.Target.IsPlayer()))
            {
                return;
            }
            var component = arg.Source.Find <ConfuseImpact>();

            if (component == null)
            {
                return;
            }
            var success   = RulesSystem.DiceRollSuccess(component.Chance);
            var logSystem = World.Get <GameLogSystem>();

            logSystem.StartNewMessage(out var logMsg, out var hoverMsg);
            logMsg.Append(arg.Origin.GetName());
            logMsg.Append(!success ? " failed to confuse " : " confused ");
            logMsg.Append(arg.Target.GetName());
            hoverMsg.AppendNewLine(RulesSystem.LastQueryString.ToString());
            if (success)
            {
                hoverMsg.Append(arg.Target.GetName());
                hoverMsg.Append(" confused for ");
                hoverMsg.Append(component.Length);
                hoverMsg.Append(" ");
                hoverMsg.Append(StringConst.TimeUnits);
            }
            logSystem.PostCurrentStrings(!success ? GameLogSystem.NormalColor : GameLogSystem.DamageColor);
            if (success)
            {
                arg.Target.Post(new ConfusionEvent(arg.Target.Entity, component.Length, true));
            }
        }
示例#2
0
 private void SetupUnitTurn(ref TurnBasedCharacterTemplate template)
 {
     if (template.TurnBased.InitiativeRoll < 0)
     {
         template.TurnBased.InitiativeRoll      = RulesSystem.CalculateD20Roll(1);
         template.TurnBased.InitiativeStatBonus = RulesSystem.CalculateStatsWithLog(template.Stats.Get(Stats.Dexterity), (int)template.Stats.GetValue(Stats.Level));
         var resultEvent = World.Get <RulesSystem>().Post(new RollInitiativeEvent(template, template.TurnBased.InitiativeRoll, template.TurnBased.InitiativeStatBonus));
         template.TurnBased.InitiativeStatBonus = resultEvent.Bonus;
         var logSystem = World.Get <GameLogSystem>();
         logSystem.StartNewMessage(out var logMsg, out var hoverMsg);
         logMsg.Append(template.GetName());
         logMsg.Append(" initiative: ");
         logMsg.Append(resultEvent.Total);
         logMsg.Append(" ");
         hoverMsg.AppendNewLine(RulesSystem.LastQueryString.ToString());
         logSystem.PostCurrentStrings(GameLogSystem.NormalColor);
     }
     else
     {
         template.TurnBased.InitiativeStatBonus = RulesSystem.CalculateStatsWithLog(template.Stats.Get(Stats.Dexterity), (int)template.Stats.GetValue(Stats.Level));
         var resultEvent = World.Get <RulesSystem>().Post(new RollInitiativeEvent(template, template.TurnBased.InitiativeRoll, template.TurnBased.InitiativeStatBonus));
         template.TurnBased.InitiativeStatBonus = resultEvent.Bonus;
     }
     template.TurnBased.StandardActions = 1;
     template.TurnBased.MinorActions    = 1;
     template.TurnBased.MoveActions     = 1;
     template.TurnBased.TurnNumber      = TurnNumber;
 }
示例#3
0
        public void Handle(ImpactEvent arg)
        {
            if (arg.Hit <= 0)
            {
                return;
            }
            var component = arg.Source.Find <InstantKillImpact>();

            if (component == null)
            {
                if (arg.Source.Find <RaiseDeadImpact>() != null)
                {
                    arg.Target.Post(new RaiseDeadEvent(arg.Origin, arg.Target));
                }
                return;
            }
            var success   = RulesSystem.DiceRollSuccess(component.Chance);
            var logSystem = World.Get <GameLogSystem>();

            logSystem.StartNewMessage(out var logMsg, out var hoverMsg);
            logMsg.Append(arg.Origin.GetName());
            logMsg.Append(" used instant kill on ");
            logMsg.Append(arg.Target.GetName());
            logMsg.Append(success ? " and succeeded" : " and failed");
            hoverMsg.AppendNewLine(RulesSystem.LastQueryString.ToString());
            logSystem.PostCurrentStrings(!success ? GameLogSystem.NormalColor : GameLogSystem.DeathColor);
            if (success)
            {
                arg.Target.Post(new DeathEvent(arg.Origin, arg.Target, 100));
                arg.Target.Post(new CombatStatusUpdate(arg.Target, "Lethal Hit!", GameLogSystem.DeathColor));
            }
        }
示例#4
0
        public void RuleEventRun(ref PrepareDamageEvent context)
        {
            var power = RulesSystem.CalculateImpactTotal(EntityStats, Stats.Power, _damageImpact.Value.NormalizedPercent);

            context.Entries.Add(new DamageEntry(power, _damageImpact.Value.DamageType, _damageImpact.Value.TargetVital,
                                                RulesSystem.LastQueryString.ToString()));
        }
示例#5
0
        public bool CanRuleEventStart(ref TryApplyEntityTag context)
        {
            var success = RulesSystem.DiceRollSuccess(context.Chance);

            PrintLog(success, context);
            return(success);
        }
示例#6
0
        public void Handle(ImpactEvent arg)
        {
            if (arg.Hit <= 0)
            {
                return;
            }
            var component    = arg.Source.Find <HealImpact>();
            var sourceEntity = component.GetEntity();
            var stats        = sourceEntity.Get <StatsContainer>();

            if (component == null || stats == null)
            {
                return;
            }
            var target    = component.HealSelf ? arg.Origin : arg.Target;
            var power     = RulesSystem.CalculateTotal(stats, Stats.Power, component.NormalizedPercent);
            var logSystem = World.Get <GameLogSystem>();

            logSystem.StartNewMessage(out var logMsg, out var hoverMsg);
            logMsg.Append(arg.Origin.GetName());
            logMsg.Append(" healed ");
            logMsg.Append(target.GetName());
            logMsg.Append(" for ");
            logMsg.Append(power.ToString("F0"));
            hoverMsg.Append(RulesSystem.LastQueryString);
            logSystem.PostCurrentStrings(GameLogSystem.DamageColor);
            target.Post(new HealingEvent(power, arg.Origin, target, component.TargetVital));
        }
示例#7
0
        public void Handle(ImpactEvent arg)
        {
            if (arg.Hit <= 0)
            {
                return;
            }
            var addMod       = arg.Source.Find <AddModImpact>();
            var sourceEntity = addMod.GetEntity();
            var stats        = sourceEntity.Get <StatsContainer>();

            if (addMod == null || stats == null)
            {
                return;
            }
            var stat = stats.Get(addMod.TargetStat);

            if (stat == null)
            {
                return;
            }
            if (stat.HasMod(addMod.ID))
            {
                RemoveStatMod(addMod.ID);
            }
            var power = RulesSystem.CalculateTotal(stats, Stats.Power, addMod.NormalizedPercent);

            stat.AddValueMod(new BaseStat.StatValueMod(power, addMod.ID));
            _fastString.Clear();
            _fastString.Append("+");
            _fastString.Append(power);
            _fastString.Append(" ");
            _fastString.Append(stat.Label);
            var label = _fastString.ToString();

            AddStatRemovalTimer(
                new RemoveStatModifier(
                    stat, new ModEntry(
                        label, label, addMod.ID, addMod.Length,
                        arg.Origin.Entity, arg.Target.Entity, addMod.Icon)));
            arg.Target.Post(new ModifiersChanged(arg.Target.Entity));
            var logSystem = World.Get <GameLogSystem>();

            logSystem.StartNewMessage(out var logMsg, out var hoverMsg);
            logMsg.Append(arg.Origin.GetName());
            logMsg.Append(" added ");
            logMsg.Append(stat.Label);
            logMsg.Append(" modifier to ");
            logMsg.Append(arg.Target.GetName());

            hoverMsg.AppendNewLine(RulesSystem.LastQueryString.ToString());
            hoverMsg.Append(label);
            hoverMsg.Append(" for ");
            hoverMsg.Append(addMod.Length);
            hoverMsg.Append(" ");
            hoverMsg.Append(StringConst.TimeUnits);
            logSystem.PostCurrentStrings(power > 0 ? GameLogSystem.HealColor : GameLogSystem.DamageColor);
        }
        public void RuleEventRun(ref CheckHitEvent context)
        {
            RulesSystem.LastQueryString.Append(context.Origin.GetName());
            RulesSystem.LastQueryString.Append(": ");
            var bonus = RulesSystem.CalculateStatsWithLog(context.Origin.Stats.Get(_component.Value.Stat), _component.Value.AddLevel ?
                                                          context.Origin.Level : -1);

            context.AttackTotal += bonus;
            RulesSystem.LastQueryString.AppendNewLine();
        }
示例#9
0
        private void CheckBuy(int index)
        {
            if (index > 0 || Data == null)
            {
                return;
            }
            var sellPrice = RulesSystem.TotalPrice(InventoryItem);

            if (World.Get <ContainerSystem>().TryAdd(Player.MainInventory, Data))
            {
                StatusMessages(string.Format("Bought for {0} {1}", sellPrice, GameText.DefaultCurrencyLabel));
                Clear();
            }
        }
示例#10
0
        public bool CanRuleEventStart(ref InstantKillEvent context)
        {
            var success   = RulesSystem.DiceRollSuccess(context.InstantKill.Chance);
            var logSystem = World.Get <GameLogSystem>();

            logSystem.StartNewMessage(out var logMsg, out var hoverMsg);
            logMsg.Append(context.Origin.GetName());
            logMsg.Append(" used instant kill on ");
            logMsg.Append(context.Target.GetName());
            logMsg.Append(success ? " and succeeded" : " and failed");
            hoverMsg.AppendNewLine(RulesSystem.LastQueryString.ToString());
            logSystem.PostCurrentStrings(!success ? GameLogSystem.NormalColor : GameLogSystem.DeathColor);
            return(success);
        }
 public void RuleEventRun(ref CheckHitEvent context)
 {
     for (int i = 0; i < _component.Value.Entries.Count; i++)
     {
         var entry = _component.Value.Entries[i];
         if (entry.TargetDefense == context.TargetDefense)
         {
             RulesSystem.LastQueryString.Append(context.Target.GetName());
             RulesSystem.LastQueryString.Append(": ");
             var bonus = RulesSystem.CalculateStatsWithLog(context.Target.Stats.Get(entry.TargetStat));
             context.AttackTotal += bonus;
             RulesSystem.LastQueryString.AppendNewLine();
         }
     }
 }
示例#12
0
        public void RuleEventEnded(ref ImpactEvent context)
        {
            var target    = _heal.Value.HealSelf ? context.Origin : context.Target;
            var power     = RulesSystem.CalculateImpactTotal(EntityStats, PixelComrades.Stats.Power, _heal.Value.NormalizedPercent);
            var logSystem = World.Get <GameLogSystem>();

            logSystem.StartNewMessage(out var logMsg, out var hoverMsg);
            logMsg.Append(context.Origin.GetName());
            logMsg.Append(" healed ");
            logMsg.Append(target.GetName());
            logMsg.Append(" for ");
            logMsg.Append(power.ToString("F0"));
            hoverMsg.Append(RulesSystem.LastQueryString);
            logSystem.PostCurrentStrings(GameLogSystem.DamageColor);
            World.Get <RulesSystem>().Post(new HealingEvent(power, context.Origin, target, _heal.Value.TargetVital));
        }
示例#13
0
        public void RuleEventRun(ref TryApplyMod context)
        {
            var stats = context.Origin.Stats;
            var stat  = stats.Get(context.TargetStat);

            if (stat == null)
            {
                return;
            }
            if (stat.HasMod(context.ID))
            {
                RemoveStatMod(context.ID);
            }
            var power = RulesSystem.CalculateImpactTotal(stats, Stats.Power, context.NormalizedPercent);

            stat.AddValueMod(new BaseStat.StatValueMod(power, context.ID));
            _fastString.Clear();
            _fastString.Append("+");
            _fastString.Append(power);
            _fastString.Append(" ");
            _fastString.Append(stat.Label);
            var label = _fastString.ToString();

            AddStatRemovalTimer(
                new RemoveStatModifier(
                    stat, new ModEntry(
                        label, label, context.ID, context.Length,
                        context.Origin.Entity, context.Target.Entity, context.Icon)));
            context.Target.Post(new ModifiersChanged(context.Target.Entity));
            var logSystem = World.Get <GameLogSystem>();

            logSystem.StartNewMessage(out var logMsg, out var hoverMsg);
            logMsg.Append(context.Origin.GetName());
            logMsg.Append(" added ");
            logMsg.Append(stat.Label);
            logMsg.Append(" modifier to ");
            logMsg.Append(context.Target.GetName());

            hoverMsg.AppendNewLine(RulesSystem.LastQueryString.ToString());
            hoverMsg.Append(label);
            hoverMsg.Append(" for ");
            hoverMsg.Append(context.Length);
            hoverMsg.Append(" ");
            hoverMsg.Append(StringConst.TimeUnits);
            logSystem.PostCurrentStrings(power > 0 ? GameLogSystem.HealColor : GameLogSystem.DamageColor);
        }
示例#14
0
        private void TryBuy()
        {
            if (Data == null)
            {
                return;
            }
            if (Player.MainInventory.IsFull)
            {
                StatusMessages("Inventory full");
                return;
            }
            var sellPrice = RulesSystem.TotalPrice(InventoryItem);

            if (Player.DefaultCurrencyHolder.Value < sellPrice)
            {
                StatusMessages(string.Format("Costs {0}, Not enough {1}", sellPrice, GameText.DefaultCurrencyLabel));
                return;
            }
            UIModalQuestion.Set(CheckBuy, string.Format("Buy for {0} {1}?", sellPrice, GameText.DefaultCurrencyLabel));
        }
示例#15
0
        public void Handle(DataDescriptionUpdating arg)
        {
            var inventoryItem = arg.Data.GetEntity().Get <InventoryItem>();

            if (inventoryItem == null)
            {
                return;
            }
            FastString.Instance.Clear();
            FastString.Instance.AppendBoldLabelNewLine("Price", RulesSystem.TotalPrice(inventoryItem));
            if (inventoryItem.Count > 1)
            {
                FastString.Instance.AppendBoldLabelNewLine("Count", inventoryItem.Count);
            }
            if (!inventoryItem.Identified)
            {
                FastString.Instance.AppendNewLine("Unidentified");
            }
            FastString.Instance.AppendBoldLabelNewLine("Rarity", inventoryItem.Rarity.ToString());
            arg.Data.Text += FastString.Instance.ToString();
        }
示例#16
0
        private void CheckBuy(int index)
        {
            if (index > 0)
            {
                _currentButton = null;
                return;
            }
            var item = _currentButton.Data.Get <InventoryItem>();

            if (item == null)
            {
                _currentButton = null;
                return;
            }
            var sellPrice = RulesSystem.TotalPrice(item);

            if (Player.MainInventory.TryAdd(item.GetEntity()))
            {
                Player.DefaultCurrencyHolder.ReduceValue(sellPrice);
                FloatingText(_currentButton.RectTransform, string.Format("Bought for {0} {1}", sellPrice, GameText.DefaultCurrencyLabel));
            }
            _currentButton = null;
        }
示例#17
0
 public void Handle(ImpactEvent arg) {
     if (arg.Hit <= 0) {
         return;
     }
     var component = arg.Source.Find<ApplyTagImpact>();
     if (component == null) {
         return;
     }
     var success = RulesSystem.DiceRollSuccess(component.Chance);
     var logSystem = World.Get<GameLogSystem>();
     logSystem.StartNewMessage(out var logMsg, out var hoverMsg);
     logMsg.Append(arg.Origin.GetName());
     logMsg.Append(!success ? " failed to apply " : " applied ");
     logMsg.Append(component.Description);
     logMsg.Append(" on ");
     logMsg.Append(arg.Target.GetName());
     hoverMsg.AppendNewLine(RulesSystem.LastQueryString.ToString());
     if (success) {
         hoverMsg.Append(arg.Target.GetName());
         hoverMsg.Append(" has ");
         hoverMsg.Append(component.Description);
         hoverMsg.Append(" for ");
         hoverMsg.Append(component.Length);
         hoverMsg.Append(" ");
         hoverMsg.Append(StringConst.TimeUnits);
     }
     logSystem.PostCurrentStrings(!success ? GameLogSystem.NormalColor : GameLogSystem.DamageColor);
     if (success) {
         arg.Target.Tags.Add(component.Tag);
         if (component.Length > 0) {
             _timerArray.Add(new TagTimerEvent(arg.Target, TimeManager.Time + component.Length,
                 component.Tag));
         }
         arg.Target.Post(new TagChangeEvent(arg.Target.Entity, component.Tag, true));
     }
 }
示例#18
0
        /*
         * var amt = arg.Amount;
         *  bool isCritical = false;
         *  string source = arg.Origin.Get<LabelComponent>()?.Text;
         *  if (string.IsNullOrEmpty(source)) {
         *      var msg = isCritical ? CombatMessages.DamagedCritNoActor : CombatMessages.DamagedNoActor;
         *      msg.Show(UIStyle.Damage.ToHex(), Name, amt.ToString("F0"));
         *  }
         *  else {
         *      var msg = isCritical ? CombatMessages.DamagedCritActor : CombatMessages.DamageFromActor;
         *      msg.Show(UIStyle.Damage.ToHex(), source, Name, amt.ToString("F0"));
         *  }
         */

        public void Handle(ImpactEvent arg)
        {
            if (arg.Hit <= 0)
            {
                return;
            }
            var component    = arg.Source.Find <DamageImpact>();
            var sourceEntity = component.GetEntity();
            var stats        = sourceEntity.Get <StatsContainer>();

            if (component == null || stats == null)
            {
                return;
            }
            var targetStat = arg.Target.Stats.GetVital(component.TargetVital);

            if (targetStat == null)
            {
                return;
            }
            var power     = RulesSystem.CalculateTotal(stats, Stats.Power, component.NormalizedPercent);
            var logSystem = World.Get <GameLogSystem>();

            logSystem.StartNewMessage(out var logMsg, out var hoverMsg);
            logMsg.Append(arg.Origin.GetName());
            logMsg.Append(" hit ");
            logMsg.Append(power.ToString("F0"));
            logMsg.Append(" ");
            logMsg.Append(targetStat.Label);
            logMsg.Append(" for ");
            logMsg.Append(arg.Target.GetName());
            hoverMsg.Append(RulesSystem.LastQueryString);
            logSystem.PostCurrentStrings(GameLogSystem.DamageColor);
            //CollisionExtensions.GetHitMultiplier(impact.Hit, impact.Target)
            arg.Target.Post(new TakeDamageEvent(power, arg, component.DamageType, component.TargetVital));
        }
示例#19
0
        private void BuyClickDel(UISimpleGameDataButton button, PointerEventData.InputButton buttonEvent)
        {
            var item = button.Data.Get <InventoryItem>();

            if (item == null)
            {
                return;
            }
            if (Player.MainInventory.IsFull)
            {
                FloatingText(button.RectTransform, "Inventory full");
                return;
            }
            var sellPrice = RulesSystem.TotalPrice(item);

            if (Player.DefaultCurrencyHolder.Value < sellPrice)
            {
                FloatingText(button.RectTransform, string.Format("Costs {0}, Not enough {1}", sellPrice, GameText.DefaultCurrencyLabel));

                return;
            }
            _currentButton = button;
            UIModalQuestion.Set(CheckBuy, string.Format("Buy for {0} {1}?", sellPrice, GameText.DefaultCurrencyLabel));
        }
示例#20
0
        public void HandleGlobal(TakeDamageEvent msg)
        {
            _eventLog.Add(msg);
            if (msg.Amount <= 0)
            {
                return;
            }
            var node = msg.Target;

            if (node == null)
            {
                return;
            }
            var logSystem = World.Get <GameLogSystem>();

            logSystem.StartNewMessage(out var dmgMsg, out var dmgHoverMsg);
            var blockDamage = node.Entity.Get <BlockDamage>();

            if (blockDamage != null)
            {
                for (int i = 0; i < blockDamage.DamageBlockers.Count; i++)
                {
                    if (blockDamage.DamageBlockers[i](msg))
                    {
                        dmgMsg.Append(msg.Target.GetName());
                        dmgMsg.Append(" completely blocked damage from ");
                        dmgMsg.Append(msg.Origin.GetName());
                        logSystem.PostCurrentStrings(GameLogSystem.DamageColor);
                        return;
                    }
                }
            }
            var damageAmount = msg.Amount;

            if (node.StatDefend != null)
            {
                for (int i = 0; i < node.StatDefend.Count; i++)
                {
                    if (node.StatDefend[i].DamageType != msg.DamageType)
                    {
                        continue;
                    }
                    var defAmt = RulesSystem.GetDefenseAmount(damageAmount, node.StatDefend[i].Stat.Value);
                    if (defAmt <= 0)
                    {
                        continue;
                    }
                    damageAmount = Mathf.Max(0, damageAmount - defAmt);
                    dmgHoverMsg.Append(node.StatDefend[i].Stat.Stat.Label);
                    dmgHoverMsg.Append(" Reduced Damage by ");
                    dmgHoverMsg.AppendNewLine(defAmt.ToString("F1"));
                }
            }
            if (node.DamageAbsorb != null)
            {
                for (int i = 0; i < node.DamageAbsorb.Count; i++)
                {
                    if (node.DamageAbsorb[i].DamageType != msg.DamageType)
                    {
                        continue;
                    }
                    var defAmt = RulesSystem.GetDefenseAmount(damageAmount, node.DamageAbsorb[i].Amount);
                    if (defAmt <= 0)
                    {
                        continue;
                    }
                    if (defAmt > node.DamageAbsorb[i].Remaining)
                    {
                        defAmt = node.DamageAbsorb[i].Remaining;
                    }
                    damageAmount = Mathf.Max(0, damageAmount - defAmt);
                    dmgHoverMsg.Append(node.DamageAbsorb[i].Source);
                    dmgHoverMsg.Append(" Absorbed ");
                    dmgHoverMsg.Append(defAmt.ToString("F1"));
                    dmgHoverMsg.AppendNewLine(" Damage");
                    node.DamageAbsorb[i].Remaining -= defAmt;
                }
                node.DamageAbsorb.CheckLimits();
            }

            float previousValue = 0;
            var   stats         = node.Stats;
            var   vital         = stats.GetVital(msg.TargetVital);

            if (vital == null)
            {
                vital = stats.GetVital(GameData.Vitals.GetID(msg.TargetVital));
            }
            if (vital != null)
            {
                dmgHoverMsg.Append(vital.ToLabelString());
                dmgHoverMsg.Append(" - ");
                dmgHoverMsg.Append(damageAmount);
                dmgHoverMsg.Append(" = ");
                previousValue  = vital.Current;
                vital.Current -= damageAmount;
                dmgHoverMsg.Append(vital.ToLabelString());
            }
            dmgMsg.Append(msg.Target.GetName());
            dmgMsg.Append(" took ");
            dmgMsg.Append(damageAmount.ToString("F1"));
            dmgMsg.Append(" damage ");
            if (damageAmount > 0)
            {
                node.Entity.Post(new CombatStatusUpdate(node.Entity, damageAmount.ToString("F1"), Color.red));
                msg.Impact.Source.PostAll(new CausedDamageEvent(damageAmount, msg));
            }
            if (vital != null && vital.Current <= 0 && msg.TargetVital == Stats.Health)
            {
                node.Entity.Post(new DeathEvent(msg.Origin, msg.Target, damageAmount - previousValue));
            }
        }
示例#21
0
        public void RuleEventRun(ref TakeDamageEvent msg)
        {
            _eventLog.Add(msg);
            if (msg.Target.IsDead)
            {
                msg.Clear();
                return;
            }
            var target    = msg.Target;
            var logSystem = World.Get <GameLogSystem>();

            logSystem.StartNewMessage(out var dmgMsg, out var dmgHoverMsg);
            if (msg.Hit.Result == CollisionResult.CriticalHit)
            {
                dmgMsg.Append("<b>");
                dmgHoverMsg.Append("<b>");
            }
            if (target.StatDefend != null)
            {
                for (int i = 0; i < target.StatDefend.Count; i++)
                {
                    for (int d = msg.Entries.Count - 1; d >= 0; d--)
                    {
                        var dmg = msg.Entries[d];
                        if (target.StatDefend[i].DamageType != dmg.DamageType)
                        {
                            continue;
                        }
                        var defAmt = RulesSystem.GetDefenseAmount(dmg.Amount, target.StatDefend[i].Stat.Value);
                        if (defAmt <= 0)
                        {
                            continue;
                        }
                        var amount = Mathf.Max(0, dmg.Amount - defAmt);
                        dmgHoverMsg.Append(target.StatDefend[i].Stat.Stat.Label);
                        dmgHoverMsg.Append(" Reduced Damage by ");
                        dmgHoverMsg.AppendNewLine(defAmt.ToString("F1"));
                        msg.Entries.Remove(dmg);
                        msg.Entries.Add(new DamageEntry(amount, dmg.DamageType, dmg.TargetVital, dmg.Description));
                    }
                }
            }
            if (target.DamageAbsorb != null)
            {
                for (int i = 0; i < target.DamageAbsorb.Count; i++)
                {
                    for (int d = msg.Entries.Count - 1; d >= 0; d--)
                    {
                        var dmg = msg.Entries[d];
                        if (target.DamageAbsorb[i].DamageType != dmg.DamageType)
                        {
                            continue;
                        }
                        var defAmt = RulesSystem.GetDefenseAmount(dmg.Amount, target.DamageAbsorb[i].Amount);
                        if (defAmt <= 0)
                        {
                            continue;
                        }
                        if (defAmt > target.DamageAbsorb[i].Remaining)
                        {
                            defAmt = target.DamageAbsorb[i].Remaining;
                        }
                        var amount = Mathf.Max(0, dmg.Amount - defAmt);
                        dmgHoverMsg.Append(target.DamageAbsorb[i].Source);
                        dmgHoverMsg.Append(" Absorbed ");
                        dmgHoverMsg.Append(defAmt.ToString("F1"));
                        dmgHoverMsg.AppendNewLine(" Damage");
                        target.DamageAbsorb[i].Remaining -= defAmt;
                        target.DamageAbsorb.CheckLimits();
                        msg.Entries.Remove(dmg);
                        msg.Entries.Add(new DamageEntry(amount, dmg.DamageType, dmg.TargetVital, dmg.Description));
                    }
                }
            }
            float totalDmg = 0;

            for (int i = 0; i < msg.Entries.Count; i++)
            {
                if (msg.Target.IsDead)
                {
                    break;
                }
                var dmg          = msg.Entries[i];
                var damageAmount = dmg.Amount;
                totalDmg += damageAmount;
                float previousValue = 0;
                var   stats         = target.Stats;
                var   vital         = stats.GetVital(dmg.TargetVital);
                if (vital == null)
                {
                    vital = stats.GetVital(GameData.Vitals.GetID(dmg.TargetVital));
                }
                if (vital != null)
                {
                    dmgHoverMsg.Append(vital.ToLabelString());
                    dmgHoverMsg.Append(" - ");
                    dmgHoverMsg.Append(damageAmount);
                    dmgHoverMsg.Append(" = ");
                    previousValue  = vital.Current;
                    vital.Current -= damageAmount;
                    dmgHoverMsg.Append(vital.ToLabelString());
                }
                dmgMsg.Append(msg.Target.GetName());
                dmgMsg.Append(" took ");
                dmgMsg.Append(damageAmount.ToString("F1"));
                dmgMsg.Append(" damage ");
                if (vital != null && vital.Current <= 0 && dmg.TargetVital == Stats.Health)
                {
                    target.Entity.Post(new DeathEvent(msg.Origin, msg.Target, msg.Hit.Point, damageAmount - previousValue));
                }
            }
            if (totalDmg > 0)
            {
                target.Entity.Post(new CombatStatusUpdate(target.Entity, totalDmg.ToString("F1"), Color.red));
                msg.Origin.Post(new CausedDamageEvent(totalDmg, msg));
                msg.Target.Post(new ReceivedDamageEvent(totalDmg, msg));
            }
            logSystem.PostCurrentStrings(GameLogSystem.DamageColor);
            msg.Clear();
        }
示例#22
0
 public float GetMax()
 {
     return(MultiplyResult * (RulesSystem.GetMaxDice(DiceSides, DiceRolls) + BaseValue + ModTotal));
 }