using UnityEngine; /// /// Miscellaneous items with dice-based restoration effects /// /// EXAMPLES: /// Small Health Potion (1d6+1 = 2-7 health): /// - healthDiceCount: 1, healthDiceType: 6, healthBonus: 1 /// /// Large Health Potion (2d8+2 = 4-18 health): /// - healthDiceCount: 2, healthDiceType: 8, healthBonus: 2 /// /// Simple range-based (5-10 health): /// - healthDiceCount: 0, healthRestoreMin: 5, healthRestoreMax: 10 /// /// Weak Mana Potion (1d4 = 1-4 mana): /// - manaDiceCount: 1, manaDiceType: 4, manaBonus: 0 /// [CreateAssetMenu(fileName = "New Misc Item", menuName = "RPG/Items/Miscellaneous")] [System.Serializable] public class MiscellaneousItem : Item { [Header("Misc Item Properties")] public bool isConsumable; public bool isStackable = true; public int maxStackSize = 99; [Header("Effects (if consumable)")] [Header("Health Restoration")] [Tooltip("Minimum health restored (used when dice count is 0)")] public int healthRestoreMin = 0; [Tooltip("Maximum health restored (used when dice count is 0)")] public int healthRestoreMax = 0; [Tooltip("Number of dice to roll (e.g., 2 for 2d6). Leave 0 to use min/max directly")] public int healthDiceCount = 0; [Tooltip("Dice type (4, 6, 8, 10, 12, 20, etc.)")] public int healthDiceType = 6; [Tooltip("Flat bonus added to dice roll (can be negative)")] public int healthBonus = 0; [Header("Mana Restoration")] [Tooltip("Minimum mana restored (used when dice count is 0)")] public int manaRestoreMin = 0; [Tooltip("Maximum mana restored (used when dice count is 0)")] public int manaRestoreMax = 0; [Tooltip("Number of dice to roll (e.g., 1 for 1d4). Leave 0 to use min/max directly")] public int manaDiceCount = 0; [Tooltip("Dice type (4, 6, 8, 10, 12, 20, etc.)")] public int manaDiceType = 4; [Tooltip("Flat bonus added to dice roll (can be negative)")] public int manaBonus = 0; public int temporaryStrengthBonus; public int temporaryDexterityBonus; public int temporaryConstitutionBonus; public int temporaryWisdomBonus; public float effectDuration; // In seconds, 0 for permanent public MiscellaneousItem() { itemType = ItemType.Miscellaneous; } public virtual void UseItem(Character character) { if (!isConsumable) { Debug.Log($"{itemName} is not consumable"); return; } // Apply effects if (healthRestoreMax > 0 || healthDiceCount > 0) { int healthRestored = CalculateHealthRestore(); character.CurrentHealth = Mathf.Min(character.MaxHealth, character.CurrentHealth + healthRestored); string rollInfo = GetHealthRollDescription(); Debug.Log($"{character.CharacterName} restored {healthRestored} health from {itemName} {rollInfo}"); } if (manaRestoreMax > 0 || manaDiceCount > 0) { int manaRestored = CalculateManaRestore(); string rollInfo = GetManaRollDescription(); Debug.Log($"{character.CharacterName} restored {manaRestored} mana from {itemName} {rollInfo}"); // TODO: Apply mana restoration when mana system is implemented } // Add temporary stat bonuses (would need a buff system to implement properly) if (temporaryStrengthBonus > 0 || temporaryDexterityBonus > 0 || temporaryConstitutionBonus > 0 || temporaryWisdomBonus > 0) { Debug.Log($"{character.CharacterName} gained temporary stat bonuses from {itemName}"); // TODO: Implement temporary buff system } } /// /// Calculate health restoration using dice rolls or min/max range /// private int CalculateHealthRestore() { if (healthDiceCount > 0 && healthDiceType > 0) { // Use dice system: XdY + bonus int total = healthBonus; for (int i = 0; i < healthDiceCount; i++) { total += Random.Range(1, healthDiceType + 1); } return total; } else if (healthRestoreMax > 0) { // Use min/max range return Random.Range(healthRestoreMin, healthRestoreMax + 1); } return 0; } /// /// Calculate mana restoration using dice rolls or min/max range /// private int CalculateManaRestore() { if (manaDiceCount > 0 && manaDiceType > 0) { // Use dice system: XdY + bonus int total = manaBonus; for (int i = 0; i < manaDiceCount; i++) { total += Random.Range(1, manaDiceType + 1); } return total; } else if (manaRestoreMax > 0) { // Use min/max range return Random.Range(manaRestoreMin, manaRestoreMax + 1); } return 0; } /// /// Get a description of the item's effects for tooltips /// public string GetEffectDescription() { string description = ""; if (healthDiceCount > 0 && healthDiceType > 0) { description += $"Restores {healthDiceCount}d{healthDiceType}"; if (healthBonus > 0) description += $"+{healthBonus}"; else if (healthBonus < 0) description += $"{healthBonus}"; description += " health"; } else if (healthRestoreMax > 0) { if (healthRestoreMin == healthRestoreMax) description += $"Restores {healthRestoreMax} health"; else description += $"Restores {healthRestoreMin}-{healthRestoreMax} health"; } if (manaDiceCount > 0 && manaDiceType > 0) { if (description.Length > 0) description += "\n"; description += $"Restores {manaDiceCount}d{manaDiceType}"; if (manaBonus > 0) description += $"+{manaBonus}"; else if (manaBonus < 0) description += $"{manaBonus}"; description += " mana"; } else if (manaRestoreMax > 0) { if (description.Length > 0) description += "\n"; if (manaRestoreMin == manaRestoreMax) description += $"Restores {manaRestoreMax} mana"; else description += $"Restores {manaRestoreMin}-{manaRestoreMax} mana"; } return description; } /// /// Get description of the health roll for debug/UI purposes /// private string GetHealthRollDescription() { if (healthDiceCount > 0 && healthDiceType > 0) { string desc = $"({healthDiceCount}d{healthDiceType}"; if (healthBonus > 0) desc += $"+{healthBonus}"; else if (healthBonus < 0) desc += $"{healthBonus}"; desc += ")"; return desc; } else if (healthRestoreMax > 0) { return $"({healthRestoreMin}-{healthRestoreMax})"; } return ""; } /// /// Get description of the mana roll for debug/UI purposes /// private string GetManaRollDescription() { if (manaDiceCount > 0 && manaDiceType > 0) { string desc = $"({manaDiceCount}d{manaDiceType}"; if (manaBonus > 0) desc += $"+{manaBonus}"; else if (manaBonus < 0) desc += $"{manaBonus}"; desc += ")"; return desc; } else if (manaRestoreMax > 0) { return $"({manaRestoreMin}-{manaRestoreMax})"; } return ""; } }