196 lines
7.5 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace BulletHellTemplate
{
/// <summary>
/// Represents the data for skill perks, including icons and damage configurations.
/// </summary>
[CreateAssetMenu(fileName = "NewSkillPerkData", menuName = "Skills/SkillPerkData")]
public class SkillPerkData : ScriptableObject
{
[Header("Skill Perk Settings")]
[Tooltip("Icon representing the skill perk.")]
public Sprite icon;
[Tooltip("Icon representing the skill perk at max level.")]
public Sprite maxLevelIcon;
[Tooltip("Frame used when the skill perk is at max level.")]
public Sprite maxLevelFrame;
[Tooltip("Maximum level achievable for this skill perk.")]
public int maxLevel = 5;
[Tooltip("Description of the skill perk.")]
public string description;
[Tooltip("Type of damage dealt by the skill perk.")]
public CharacterTypeData damageType;
[Header("Damage Entity Prefabs")]
[Tooltip("DamageEntity prefab for the initial level.")]
public DamageEntity initialDamagePrefab;
[Tooltip("DamageEntity prefab for the max level.")]
public DamageEntity maxLvDamagePrefab;
[Header("Effects on Spawn Skill")]
[Tooltip("Effect to spawn when the skill is activated.")]
public GameObject spawnEffect;
[Tooltip("Audio clip to play when the skill is activated.")]
public AudioClip spawnAudio;
[Tooltip("Duration of the spawn effect.")]
public float effectDuration;
[Tooltip("Speed of the damage entity.")]
public float speed = 5f;
[Tooltip("Lifetime of the damage entity.")]
public float lifeTime = 5f;
[Tooltip("Does this skill perk have no cooldown?")]
public bool withoutCooldown;
[Tooltip("Cooldown time between uses.")]
public float cooldown = 1f;
[Tooltip("Does the skill perk have lifesteal?")]
public bool isHpLeech;
[Header("Multi-Shot Settings")]
[Tooltip("Is this a Multi-Shot skill perk?")]
public bool isMultiShot;
[Tooltip("Number of shots.")]
public int shots;
[Tooltip("Angle between shots.")]
public float angle = 30;
[Tooltip("Delay between each shot.")]
public float delay = 0;
[Tooltip("Do evolve changes affect Multi-Shot settings?")]
public bool evolveChanges;
[Tooltip("Number of shots when evolved.")]
public int shotsEvolved;
[Tooltip("Angle between shots when evolved.")]
public float angleEvolved = 30;
[Tooltip("Delay between shots when evolved.")]
public float delayEvolved = 0;
[Header("Orbital Settings")]
[Tooltip("Is this an Orbital skill perk?")]
public bool isOrbital;
[Tooltip("Distance before starting to orbit.")]
public float orbitalDistance = 5f;
[Header("Boomerang Settings")]
[Tooltip("Is this a Boomerang skill perk?")]
public bool isBoomerangSkill;
[Tooltip("Maximum distance before returning.")]
public float maxDistance;
[Header("Ricochet Settings")]
[Tooltip("Does the skill perk ricochet off surfaces?")]
public bool isRicochet;
[Header("Dash Settings")]
[Tooltip("Is this a Dash skill perk?")]
public bool isDash;
[Tooltip("Speed of the dash.")]
public float dashSpeed;
[Tooltip("Duration of the dash.")]
public float dashDuration;
[Header("Shield Settings")]
[Tooltip("Is this a Shield skill perk?")]
public bool isShield;
[Tooltip("Amount of shield provided.")]
public int shieldAmount;
[Tooltip("Duration of the shield.")]
public float shieldDuration;
[Header("Melee Settings")]
[Tooltip("Is this a Melee skill perk?")]
public bool isMelee;
[Header("Slow Effect Settings")]
[Tooltip("Does the skill perk apply a slow effect?")]
public bool applySlow;
[Tooltip("Percentage to slow the target.")]
public float slowPercent;
[Tooltip("Duration of the slow effect.")]
public float slowDuration;
[Header("Knockback Effect Settings")]
[Tooltip("Does the skill perk apply knockback?")]
public bool applyKnockback;
[Tooltip("Distance of the knockback.")]
public float knockbackDistance;
[Tooltip("Duration of the knockback effect.")]
public float knockbackDuration;
[Header("Stun Effect Settings")]
[Tooltip("Does the skill perk apply stun?")]
public bool applyStun;
[Tooltip("Duration of the stun effect.")]
public float stunDuration;
[Header("Damage Over Time (DOT) Settings")]
[Tooltip("Does the skill perk apply damage over time?")]
public bool applyDOT;
[Tooltip("Total DOT damage.")]
public float dotAmount;
[Tooltip("Duration of the DOT effect.")]
public float dotDuration;
[Header("Evolution Settings")]
[Tooltip("Does this skill perk have an evolution?")]
public bool hasEvolution;
[Tooltip("Perk required to evolve this skill perk.")]
public StatPerkData perkRequireToEvolveSkill;
[Header("Damage Per Level")]
[Tooltip("Damage values for each level.")]
public List<float> damagePerLevel = new List<float> { 0, 0, 0, 0, 0 };
[Header("Attacker Damage Rate Per Level")]
[Tooltip("Attacker damage rate percentages for each level.")]
public List<float> attackerDamageRate = new List<float> { 0, 0, 0, 0, 0 };
/// <summary>
/// Gets the damage for a given level.
/// </summary>
/// <param name="level">The level of the skill perk.</param>
/// <returns>The damage for the specified level.</returns>
public float GetDamageForLevel(int level)
{
int index = level - 1;
if (index < 0 || index >= damagePerLevel.Count)
{
Debug.LogWarning($"Level {level} out of range. Returning 0 damage. Expected range: 1 to {damagePerLevel.Count}");
return 0;
}
return damagePerLevel[index];
}
/// <summary>
/// Gets the attacker damage rate for a given level.
/// </summary>
/// <param name="level">The level of the skill perk.</param>
/// <returns>The attacker damage rate for the specified level.</returns>
public float GetAttackerDamageRateForLevel(int level)
{
int index = level - 1;
if (index < 0 || index >= attackerDamageRate.Count)
{
Debug.LogWarning($"Level {level} out of range. Returning 0 damage rate. Expected range: 1 to {attackerDamageRate.Count}");
return 0;
}
return attackerDamageRate[index];
}
/// <summary>
/// Determines if the skill perk can evolve based on the possession of the required stat perk.
/// </summary>
/// <param name="character">The character entity to check for the required perk.</param>
/// <returns>True if the skill perk can evolve, otherwise false.</returns>
public bool CanEvolve(CharacterEntity character)
{
if (!hasEvolution || perkRequireToEvolveSkill == null)
{
return false;
}
return character.GetStatsPerkData().Contains(perkRequireToEvolveSkill);
}
}
}