Targeted item actions (action/heal), item.add scenario action, inventory cell Decorate; mod cover
This commit is contained in:
1 parent
d560638501
commit
468e393550
9 files changed
+313
-1
No files matched your search
@@ -0,0 +1,43 @@
|
||||
using System;
|
||||
using Cthangover.Core.Items;
|
||||
using Cthangover.Core.Settings;
|
||||
|
||||
namespace Cthangover.Mods.Items
|
||||
{
|
||||
/// <summary>
|
||||
/// Restores health of the chosen party member (<c>"ItemAction": "action/heal"</c>).
|
||||
/// The amount is item data, not code: the item's <c>"heal"</c> key (an extra JSON
|
||||
/// key, so it lands in <see cref="IItem.Properties"/>), which lets one action serve
|
||||
/// a mushroom and an elixir alike. Health never rises above its base value, and a
|
||||
/// fallen character (health 0) is not revived — that is a different effect.
|
||||
/// The party member's attributes are the very objects the battle uses, so a heal
|
||||
/// in the inventory during a battle shows on the battle widgets at once.
|
||||
/// </summary>
|
||||
public class HealItemAction : ITargetedItemAction
|
||||
{
|
||||
/// <summary>Item property with the amount of health restored.</summary>
|
||||
public const string HealProperty = "heal";
|
||||
|
||||
/// <summary>Action id referenced by item definitions.</summary>
|
||||
public string ID => "action/heal";
|
||||
|
||||
/// <summary>Healing always needs a target; without one nothing happens.</summary>
|
||||
public bool UseAction(IItem item) => false;
|
||||
|
||||
/// <summary>
|
||||
/// Adds the item's <c>heal</c> amount to the target's health, capped at the
|
||||
/// base value. Returns <c>false</c> (item not spent) for a missing target, a
|
||||
/// non-positive amount, a fallen target or one already at full health.
|
||||
/// </summary>
|
||||
public bool UseOn(IItem item, CharacterInfoData target)
|
||||
{
|
||||
var health = target?.Attributes?.Health;
|
||||
var amount = item?.Properties?.GetInt(HealProperty) ?? 0;
|
||||
if (health == null || amount <= 0 || health.Value <= 0 || health.Value >= health.BaseValue)
|
||||
return false;
|
||||
|
||||
health.Value = Math.Min(health.BaseValue, health.Value + amount);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user