/// <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)); } }
/// <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); } }
/// <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)); } }
/// <summary> 回復する処理 </summary> /// <param name="evplayer">イベント処理機、何らかのイベント発行する場合使用</param> public abstract int Heal(EventPlayer evplayer, int heal, Unit fromUnit);
/// <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);
/// <summary> ステータスを取り除く(Node指定) </summary> /// <param name="evplayer">イベント処理機、何らかのイベント発行する場合使用</param> public void RemoveStatus(EventPlayer evplayer, LinkedListNode <IStatusTag> statusNode) => HaveStatus.Remove(statusNode);
/// <summary> 回復する処理 </summary> public override int Heal(EventPlayer evplayer, int heal, Unit fromUnit) { // HP回復 HP = Math.Min(GetBattleStatus(BattleStatusType.MaxHP), HP + heal); return(heal); }
/// <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)); }