Пример #1
0
 /// <summary> ステータスを取り除く </summary>
 /// <param name="evplayer">イベント処理機、何らかのイベント発行する場合使用</param>
 /// <param name="isAll">すべて取り除くかどうか、falseの場合最初に登録されたもの</param>
 public void RemoveStatus(EventPlayer evplayer, Status status, Tag target = null, bool isAll = false)
 {
     if (isAll)
     {
         foreach (var node in GetStatusNodeList(status, target))
         {
             RemoveStatus(evplayer, node);
         }
     }
     else
     {
         RemoveStatus(evplayer, GetStatusNode(status, target));
     }
 }
Пример #2
0
 /// <summary> ステータスの数値を変更する </summary>
 /// <param name="evplayer">イベント処理機、何らかのイベント発行する場合使用</param>
 /// <param name="change">変更関数(元数値)=>変更数値</param>
 /// <param name="status">ステータス種別</param>
 /// <param name="target">軽減・弱点の場合の対象タグ</param>
 /// <param name="fillter">対象をとるFillter</param>
 public void ChangeStatusValue(EventPlayer evplayer, Func <int, int> change, Status status, Tag target = null,
                               Func <IEnumerable <IStatusTag>, IEnumerable <TagStatusValue> > fillter  = null)
 {
     if (!status.HasValue())
     {
         throw new ArgumentException("status is incorrect. Not value tag");
     }
     if (fillter == null)
     {
         fillter = l => l.Take(1).Cast <TagStatusValue>();
     }
     foreach (var svt in fillter(GetStatusList(status, target)))
     {
         svt.Value = change(svt.Value);
     }
 }
Пример #3
0
        /// <summary> ステータスを与える </summary>
        /// <param name="evplayer">イベント処理機、何らかのイベント発行する場合使用</param>
        /// <param name="status">ステータス種別</param>
        /// <param name="value">数値を持つステータスならその数値</param>
        /// <param name="target">軽減・弱点の対象</param>
        public void GiveStatus(EventPlayer evplayer, Status status, int value = 0, Tag target = null)
        {
            if (status.HasValue())
            {
                if (IsExistStatus(status, target))
                // 既に同じステータスを持っている場合
                {
                    var tag = GetStatus <TagStatusValue>(status, target);
                    switch (tag.Type)
                    {
                    // 加算タイプ
                    case TagStatusType.Add:
                        tag.Value += value;
                        break;

                    // 大きい方優先タイプ
                    case TagStatusType.Max:
                        tag.Value = Math.Max(tag.Value, value);
                        break;

                    // 重複可能タイプ
                    case TagStatusType.Overlap:
                        tag       = TagStatus.MakeStatus(status, target) as TagStatusValue;
                        tag.Value = value;
                        HaveStatus.AddLast(tag);
                        break;

                    default:
                        throw new Exception("TagStatusValue Type is incorrect.");
                    }
                }
                else
                {
                    var tag = TagStatus.MakeStatus(status, target) as TagStatusValue;
                    tag.Value = value;
                    HaveStatus.AddLast(tag);
                }
            }
            else if (!IsExistStatus(status))
            {
                HaveStatus.AddLast(TagStatus.MakeStatus(status, null, IsCharacter));
            }
        }
Пример #4
0
 /// <summary> 回復する処理 </summary>
 /// <param name="evplayer">イベント処理機、何らかのイベント発行する場合使用</param>
 public abstract int Heal(EventPlayer evplayer, int heal, Unit fromUnit);
Пример #5
0
 /// <summary> ダメージを受ける処理 </summary>
 /// <param name="evplayer">イベント処理機、何らかのイベント発行する場合使用</param>
 /// <param name="damage">与ダメージ</param>
 /// <param name="type">ダメージ種別</param>
 /// <param name="fromUnit">攻撃Unit</param>
 /// <returns>実際のダメージ、負の場合[障壁]分</returns>
 public abstract Tuple <int, int> Damage(EventPlayer evplayer, int damage, DamageType type, Unit fromUnit);
Пример #6
0
 /// <summary> ステータスを取り除く(Node指定) </summary>
 /// <param name="evplayer">イベント処理機、何らかのイベント発行する場合使用</param>
 public void RemoveStatus(EventPlayer evplayer, LinkedListNode <IStatusTag> statusNode) => HaveStatus.Remove(statusNode);
Пример #7
0
 /// <summary> 回復する処理 </summary>
 public override int Heal(EventPlayer evplayer, int heal, Unit fromUnit)
 {
     // HP回復
     HP = Math.Min(GetBattleStatus(BattleStatusType.MaxHP), HP + heal);
     return(heal);
 }
Пример #8
0
        /// <summary> ダメージを受ける処理 </summary>
        /// <param name="evplayer">イベント処理機、何らかのイベント発行する場合使用</param>
        /// <param name="damage">与ダメージ</param>
        /// <param name="type">ダメージ種別</param>
        /// <param name="fromUnit">攻撃Unit</param>
        /// <returns>[実際のダメージ,[障壁]減少分]</returns>
        public override Tuple <int, int> Damage(EventPlayer evplayer, int damage, DamageType type, Unit fromUnit)
        {
            switch (type)
            {
            case DamageType.Physics:
                // 物理ダメージなら物理防御力分減少
                damage -= GetBattleStatus(BattleStatusType.PhyDefense);
                break;

            case DamageType.Magic:
                // 魔法ダメージなら魔法防御力分減少
                damage -= GetBattleStatus(BattleStatusType.MagDefense);
                break;

            case DamageType.Through:
            case DamageType.Directly:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            // 直接ダメージ以外なら[軽減]を適用
            if (type != DamageType.Directly)
            {
                var mitigations = GetStatusList <TagStatusTarget>(Status.Mitigation)
                                  .Where(t => t.IsApplication(this, fromUnit))
                                  .Select(t => t.Value);
                if (mitigations.Any())
                {
                    damage -= mitigations.Max();
                }
            }
            // 軽減系の効果適用

            // ダメージが0以下なら0に
            damage = Math.Max(0, damage);
            var barrierNum = 0;

            // [障壁]がある
            if (IsExistStatus(Status.Barrier))
            {
                var barrierNode = GetStatusNode(Status.Barrier);
                var barrier     = barrierNode.Value as TagStatusValue;
                barrierNum     = Math.Min(damage, barrier.Value);
                barrier.Value -= barrierNum;
                // [障壁]消滅
                if (barrier.Value <= 0)
                {
                    RemoveStatus(evplayer, barrierNode);
                }
                damage -= barrierNum;
            }
            // HP減少
            HP = Math.Max(0, HP - damage);
            // [戦闘不能]処理
            if (HP <= 0)
            {
                evplayer.AddNext(EventType.GiveStatus, new object[] { Status.UnableFight, fromUnit, this });
            }
            return(new Tuple <int, int>(damage, barrierNum));
        }