using BumpCombat.Combat; using UnityEngine; namespace BumpCombat.Player { public enum ActiveArtifactEffect { Dash, Pulse, Phoenix, Cyclone, ThunderCrash, ChainLightning, } [CreateAssetMenu( fileName = "ActiveArtifact", menuName = "BumpCombat/Active Artifact")] public sealed class ActiveArtifactDefinition : ScriptableObject { [SerializeField] private string artifactId; [SerializeField] private string displayName; [SerializeField] private string placeholderSymbol; [SerializeField] private ActiveArtifactEffect effect; [SerializeField] private DamageTag damageTag = DamageTag.Collision; [SerializeField] private Color iconColor = Color.white; [SerializeField] private Color effectColor = Color.white; [SerializeField, Min(0f)] private float normalGaugeCost = 25f; [SerializeField, Min(0f)] private float chargedGaugeCost = 60f; [SerializeField, Min(0.01f)] private float chargeDuration = 0.8f; [SerializeField, Min(0f)] private float normalDamage = 15f; [SerializeField, Min(0f)] private float chargedDamage = 30f; [SerializeField, Min(0f)] private float normalRange = 1.25f; [SerializeField, Min(0f)] private float chargedRange = 2f; [SerializeField, Min(0f)] private float normalKnockback = 1.5f; [SerializeField, Min(0f)] private float chargedKnockback = 3f; [SerializeField, Min(0f)] private float normalWidth = 0.5f; [SerializeField, Min(0f)] private float chargedWidth = 1f; [SerializeField, Min(0f)] private float normalMoveDistance; [SerializeField, Min(0f)] private float chargedMoveDistance; [SerializeField, Min(0f)] private float normalDuration = 0.15f; [SerializeField, Min(0f)] private float chargedDuration = 0.5f; [SerializeField, Min(0.01f)] private float hitInterval = 0.15f; [SerializeField, Min(1)] private int normalMaxTargets = 1; [SerializeField, Min(1)] private int chargedMaxTargets = 12; [SerializeField, Min(1)] private int chargedMaxHitsPerTarget = 1; [SerializeField, Min(0f)] private float chainRange = 2.5f; [SerializeField, Min(1)] private int normalChainDepth = 4; [SerializeField, Min(1)] private int chargedChainDepth = 4; [SerializeField, Min(1)] private int normalBranchCount = 1; [SerializeField, Min(1)] private int chargedBranchCount = 2; [SerializeField, Range(0f, 1f)] private float damageMultiplierPerChain = 0.9f; [SerializeField, Min(0f)] private float normalInvulnerabilityDuration; [SerializeField, Min(0f)] private float chargedInvulnerabilityDuration; [SerializeField, Range(0f, 1f)] private float normalDamageReduction; [SerializeField, Range(0f, 1f)] private float chargedDamageReduction; [SerializeField, Min(0f)] private float normalBuffDuration; [SerializeField, Min(0f)] private float chargedBuffDuration; [SerializeField, Range(0f, 1f)] private float normalMoveSpeedIncrease; [SerializeField, Range(0f, 1f)] private float chargedMoveSpeedIncrease; [SerializeField, Min(0f)] private float normalIgniteDuration; [SerializeField, Min(0f)] private float chargedIgniteDuration; [SerializeField, Min(0f)] private float normalIgniteInterval = 0.5f; [SerializeField, Min(0f)] private float chargedIgniteInterval = 0.5f; [SerializeField, Min(0f)] private float normalIgniteTickDamage; [SerializeField, Min(0f)] private float chargedIgniteTickDamage; [SerializeField, Range(0f, 1f)] private float normalVulnerabilityIncrease; [SerializeField, Range(0f, 1f)] private float chargedVulnerabilityIncrease; [SerializeField, Min(0f)] private float normalVulnerabilityDuration; [SerializeField, Min(0f)] private float chargedVulnerabilityDuration; [SerializeField, Range(0f, 1f)] private float normalShockChance; [SerializeField, Range(0f, 1f)] private float chargedShockChance; [SerializeField, Range(0f, 1f)] private float normalShockIncrease; [SerializeField, Range(0f, 1f)] private float chargedShockIncrease; [SerializeField, Min(0f)] private float normalShockDuration; [SerializeField, Min(0f)] private float chargedShockDuration; public string ArtifactId => artifactId; public string DisplayName => displayName; public string PlaceholderSymbol => placeholderSymbol; public ActiveArtifactEffect Effect => effect; public ArtifactColor ArtifactColor => GetArtifactColor(effect); public DamageTag DamageTag => damageTag; public Color IconColor => iconColor; public Color EffectColor => effectColor; public float NormalGaugeCost => normalGaugeCost; public float ChargedGaugeCost => chargedGaugeCost; public float ChargeDuration => chargeDuration; public float NormalDamage => normalDamage; public float ChargedDamage => chargedDamage; public float NormalRange => normalRange; public float ChargedRange => chargedRange; public float NormalKnockback => normalKnockback; public float ChargedKnockback => chargedKnockback; public float NormalWidth => normalWidth; public float ChargedWidth => chargedWidth; public float NormalMoveDistance => normalMoveDistance; public float ChargedMoveDistance => chargedMoveDistance; public float NormalDuration => normalDuration; public float ChargedDuration => chargedDuration; public float HitInterval => hitInterval; public int NormalMaxTargets => normalMaxTargets; public int ChargedMaxTargets => chargedMaxTargets; public int ChargedMaxHitsPerTarget => chargedMaxHitsPerTarget; public float ChainRange => chainRange; public int NormalChainDepth => normalChainDepth; public int ChargedChainDepth => chargedChainDepth; public int NormalBranchCount => normalBranchCount; public int ChargedBranchCount => chargedBranchCount; public float DamageMultiplierPerChain => damageMultiplierPerChain; public float NormalInvulnerabilityDuration => normalInvulnerabilityDuration; public float ChargedInvulnerabilityDuration => chargedInvulnerabilityDuration; public float NormalDamageReduction => normalDamageReduction; public float ChargedDamageReduction => chargedDamageReduction; public float NormalBuffDuration => normalBuffDuration; public float ChargedBuffDuration => chargedBuffDuration; public float NormalMoveSpeedIncrease => normalMoveSpeedIncrease; public float ChargedMoveSpeedIncrease => chargedMoveSpeedIncrease; public float NormalIgniteDuration => normalIgniteDuration; public float ChargedIgniteDuration => chargedIgniteDuration; public float NormalIgniteInterval => normalIgniteInterval; public float ChargedIgniteInterval => chargedIgniteInterval; public float NormalIgniteTickDamage => normalIgniteTickDamage; public float ChargedIgniteTickDamage => chargedIgniteTickDamage; public float NormalVulnerabilityIncrease => normalVulnerabilityIncrease; public float ChargedVulnerabilityIncrease => chargedVulnerabilityIncrease; public float NormalVulnerabilityDuration => normalVulnerabilityDuration; public float ChargedVulnerabilityDuration => chargedVulnerabilityDuration; public float NormalShockChance => normalShockChance; public float ChargedShockChance => chargedShockChance; public float NormalShockIncrease => normalShockIncrease; public float ChargedShockIncrease => chargedShockIncrease; public float NormalShockDuration => normalShockDuration; public float ChargedShockDuration => chargedShockDuration; public static ArtifactColor GetArtifactColor(ActiveArtifactEffect effectKind) { return effectKind switch { ActiveArtifactEffect.Dash or ActiveArtifactEffect.Cyclone => ArtifactColor.Green, ActiveArtifactEffect.Pulse or ActiveArtifactEffect.Phoenix => ArtifactColor.Red, ActiveArtifactEffect.ThunderCrash or ActiveArtifactEffect.ChainLightning => ArtifactColor.Blue, _ => ArtifactColor.Green, }; } public static Color32 GetArtifactPaletteColor(ArtifactColor color) { return color switch { ArtifactColor.Green => new Color32(103, 231, 178, 255), ArtifactColor.Red => new Color32(255, 100, 100, 255), _ => new Color32(104, 179, 255, 255), }; } #if UNITY_EDITOR public void Configure( string id, string name, string symbol, ActiveArtifactEffect effectKind, DamageTag tag, Color icon, Color effectTint, float normalCost, float chargedCost, float chargeTime, float normalAttackDamage, float chargedAttackDamage, float normalEffectRange, float chargedEffectRange, float normalKnockbackForce, float chargedKnockbackForce, float normalEffectWidth = 0.5f, float chargedEffectWidth = 1f, float normalMovementDistance = 0f, float chargedMovementDistance = 0f, float normalEffectDuration = 0.15f, float chargedEffectDuration = 0.5f, float multiHitInterval = 0.15f, int normalTargetLimit = 1, int chargedTargetLimit = 12, float chainHopRange = 2.5f, int normalMaximumChainDepth = 4, int chargedMaximumChainDepth = 4, int normalBranches = 1, int chargedBranches = 2, float chainDamageMultiplier = 0.9f, float normalInvulnerability = 0f, float chargedInvulnerability = 0f, int chargedHitLimitPerTarget = 1, float normalIncomingDamageReduction = 0f, float chargedIncomingDamageReduction = 0f, float normalPlayerBuffDuration = 0f, float chargedPlayerBuffDuration = 0f, float normalMovementSpeedIncrease = 0f, float chargedMovementSpeedIncrease = 0f, float normalBurnDuration = 0f, float chargedBurnDuration = 0f, float normalBurnInterval = 0.5f, float chargedBurnInterval = 0.5f, float normalBurnTickDamage = 0f, float chargedBurnTickDamage = 0f, float normalBumpVulnerabilityIncrease = 0f, float chargedBumpVulnerabilityIncrease = 0f, float normalBumpVulnerabilityDuration = 0f, float chargedBumpVulnerabilityDuration = 0f, float normalElectrocuteChance = 0f, float chargedElectrocuteChance = 0f, float normalElectrocuteIncrease = 0f, float chargedElectrocuteIncrease = 0f, float normalElectrocuteDuration = 0f, float chargedElectrocuteDuration = 0f) { artifactId = id; displayName = name; placeholderSymbol = symbol; effect = effectKind; damageTag = tag; iconColor = icon; effectColor = effectTint; normalGaugeCost = normalCost; chargedGaugeCost = chargedCost; chargeDuration = chargeTime; normalDamage = normalAttackDamage; chargedDamage = chargedAttackDamage; normalRange = normalEffectRange; chargedRange = chargedEffectRange; normalKnockback = normalKnockbackForce; chargedKnockback = chargedKnockbackForce; normalWidth = normalEffectWidth; chargedWidth = chargedEffectWidth; normalMoveDistance = normalMovementDistance; chargedMoveDistance = chargedMovementDistance; normalDuration = normalEffectDuration; chargedDuration = chargedEffectDuration; hitInterval = multiHitInterval; normalMaxTargets = normalTargetLimit; chargedMaxTargets = chargedTargetLimit; chainRange = chainHopRange; normalChainDepth = normalMaximumChainDepth; chargedChainDepth = chargedMaximumChainDepth; normalBranchCount = normalBranches; chargedBranchCount = chargedBranches; damageMultiplierPerChain = chainDamageMultiplier; normalInvulnerabilityDuration = normalInvulnerability; chargedInvulnerabilityDuration = chargedInvulnerability; chargedMaxHitsPerTarget = chargedHitLimitPerTarget; normalDamageReduction = normalIncomingDamageReduction; chargedDamageReduction = chargedIncomingDamageReduction; normalBuffDuration = normalPlayerBuffDuration; chargedBuffDuration = chargedPlayerBuffDuration; normalMoveSpeedIncrease = normalMovementSpeedIncrease; chargedMoveSpeedIncrease = chargedMovementSpeedIncrease; normalIgniteDuration = normalBurnDuration; chargedIgniteDuration = chargedBurnDuration; normalIgniteInterval = normalBurnInterval; chargedIgniteInterval = chargedBurnInterval; normalIgniteTickDamage = normalBurnTickDamage; chargedIgniteTickDamage = chargedBurnTickDamage; normalVulnerabilityIncrease = normalBumpVulnerabilityIncrease; chargedVulnerabilityIncrease = chargedBumpVulnerabilityIncrease; normalVulnerabilityDuration = normalBumpVulnerabilityDuration; chargedVulnerabilityDuration = chargedBumpVulnerabilityDuration; normalShockChance = normalElectrocuteChance; chargedShockChance = chargedElectrocuteChance; normalShockIncrease = normalElectrocuteIncrease; chargedShockIncrease = chargedElectrocuteIncrease; normalShockDuration = normalElectrocuteDuration; chargedShockDuration = chargedElectrocuteDuration; } #endif } }