private bool ChangeStats(ChangeType changeType, StatsProperty property, decimal value, bool allowLess = false) { var changedBase = BaseStats.Apply( new StatsEffect(changeType, new Dictionary <StatsProperty, decimal> { { property, value } }) ); if (value < 0) { // При понижении статов, нужно проверять с учетом предметов. // (базовое здоровье может быть меньше нуля, т.к. предметы тебя спасут) var changed = ApplyItems(changedBase, User.ActiveItemsManager.ActiveItems); var newValue = changed.Effect[property]; if (!allowLess && newValue < MinStats.Effect[property]) { return(false); } } else { // При повышении статов, нужно проверять без учета предметов. // (базовое здоровье не может быть больше максимума, но предметы могут повысить за пределы максимума) var newValue = changedBase.Effect[property]; var maxValue = MaxStats.Effect[property]; if (newValue > maxValue) { // Если результат получился больше мсаксимума, то устанавливается максимум changedBase = BaseStats.Apply( new StatsEffect(ChangeType.Set, new Dictionary <StatsProperty, decimal> { { property, maxValue } }) ); } } BaseStats = changedBase; RecalculateStats(); return(true); }
set => SetValue(StatsProperty, value);
private string AddInfo(IEnumerable <string> messages) { // Path var roomMgr = ObjectManager <IRoom> .Instance.Get <Room.RoomManager>(); var path = string.Join(">", User.RoomManager.Rooms .Reverse() .Select(room => roomMgr.Get(room.Identifier)?.Name) .Concat(new[] { roomMgr.Get(User.RoomManager.CurrentRoom?.Identifier)?.Name }) .Where(n => n != null) ); var stats = new StringBuilder(); foreach (ShownStats shownStat in Enum.GetValues(typeof(ShownStats))) { if ((shownStat & ShownStats) == 0) { continue; } switch (shownStat) { case ShownStats.Health: { var heart = "♥️"; var percent = User.Info.CurrentStats.Effect[StatsProperty.Health] / User.Info.MaxStats.Effect[StatsProperty.Health]; if (percent < 1m / 3) { heart = "🖤️"; // black } else if (percent < 2m / 3) { heart = "💛"; // yellow } else if (percent < 2m / 3) { heart = "❤️"; // red } stats.Append($"{heart}{User.Info.CurrentStats.Effect[StatsProperty.Health]:F2}"); break; } case ShownStats.Intelligence: { const StatsProperty prop = StatsProperty.Intelligence; stats.Append($" {Stats.Stats.Emojis[prop]}{User.Info.CurrentStats.Effect[prop]:F2}"); break; } case ShownStats.Strength: { const StatsProperty prop = StatsProperty.Strength; stats.Append($" {Stats.Stats.Emojis[prop]}{User.Info.CurrentStats.Effect[prop]:F2}"); break; } case ShownStats.Mana: { const StatsProperty prop = StatsProperty.Mana; stats.Append($" {Stats.Stats.Emojis[prop]}{User.Info.CurrentStats.Effect[prop]:F2}"); break; } case ShownStats.Stamina: { const StatsProperty prop = StatsProperty.Stamina; stats.Append($" {Stats.Stats.Emojis[prop]}{User.Info.CurrentStats.Effect[prop]:F2}"); break; } case ShownStats.Defence: { const StatsProperty prop = StatsProperty.Defence; stats.Append($" {Stats.Stats.Emojis[prop]}{User.Info.CurrentStats.Effect[prop]:F2}"); break; } case ShownStats.Karma: { const StatsProperty prop = StatsProperty.Karma; stats.Append($" {Stats.Stats.Emojis[prop]}{User.Info.CurrentStats.Effect[prop]:F2}"); break; } case ShownStats.Gold: { stats.Append($" 💰{User.Info.Gold:F2}"); break; } case ShownStats.Default: break; default: { throw new ArgumentOutOfRangeException(); } } } return(string.Join("\n\n", Enumerable.Empty <string>() .Concat(new[] { $"<i>{path}</i>" }) .Concat(messages) .Concat(new[] { stats.ToString() }) )); }
get => (IEnumerable <IStatItem <double> >)GetValue(StatsProperty); set => SetValue(StatsProperty, value);
public decimal? GetStatOrNull(StatsProperty property) { return Effect.TryGetValue(property, out var result) ? (decimal?) result : null; }
public decimal GetStat(StatsProperty property) { return(GetStatOrNull(property) ?? DefaultStats[property]); }
public decimal GetStat(StatsProperty property) { return(Effect.TryGetValue(property, out var result) ? result : DefaultStats[property]); }
/// <summary> /// Изменяет указанную характеристику героя. Не позволяет стать характеристике больше максимума или меньше нуля. /// </summary> /// <param name="property">Какую характеристку следует изменить</param> /// <param name="value">На сколько надо изменить. Отрицательное для того, чтобы уменьшить</param> /// <param name="set">Необходимо жестко установить новое значение (true) или прибавить к текущему</param> public bool ChangeStats(StatsProperty property, decimal value, bool set = false) { return(ChangeStats(set ? ChangeType.Set : ChangeType.Add, property, value)); }