175 lines
5.8 KiB
C#
175 lines
5.8 KiB
C#
using UnityEngine;
|
|
using System.Collections.Generic;
|
|
|
|
[CreateAssetMenu(fileName = "NewAllyHero", menuName = "SO_Data/AllyHero")]
|
|
public class AllyHero_SO : ScriptableObject
|
|
{
|
|
[Header("Inspector")]
|
|
public string ally_heroName;
|
|
public string ally_heroDesignation;
|
|
public int ally_heroID;
|
|
|
|
[Header("Inspector")]
|
|
public Sprite ally_heroImage;
|
|
[Header("Inspector")]
|
|
public Sprite ally_heroProfile;
|
|
[Header("Inspector")]
|
|
public Sprite ally_heroSelectIcon;
|
|
[Header("Inspector")]
|
|
public Sprite ally_heroIcon;
|
|
[Header("Inspector")]
|
|
public Sprite ally_heroPoster;
|
|
[Header("Inspector")]
|
|
public Sprite ally_hero_HD_image;
|
|
[Header("Inspector")]
|
|
public Sprite ally_hero_squareProfile;
|
|
|
|
[Header("Inspector")]
|
|
public Color ally_heroThemeColor;
|
|
|
|
[Header("Inspector")]
|
|
[TextArea(3, 10)]
|
|
[Tooltip("Documentation text normalized.")]
|
|
public string ally_heroDescription;
|
|
|
|
[Header("Inspector")]
|
|
public List<AllyLevelInfo> levelStats = new List<AllyLevelInfo>();
|
|
|
|
[System.Serializable]
|
|
public class AllyLevelInfo
|
|
{
|
|
[Tooltip("Documentation text normalized.")]
|
|
public string levelName;
|
|
public int levelID;
|
|
|
|
[Tooltip("Documentation text normalized.")]
|
|
public int attack = 0;
|
|
|
|
[Tooltip("Documentation text normalized.")]
|
|
public int maxHP = 100;
|
|
|
|
[Tooltip("Documentation text normalized.")]
|
|
public float damageResistance = 0f;
|
|
|
|
[Tooltip("Documentation text normalized.")]
|
|
public int maxMana = 100;
|
|
|
|
[Tooltip("Documentation text normalized.")]
|
|
public float scoreEfficiency = 1f;
|
|
|
|
[Header("Inspector")]
|
|
[Tooltip("Documentation text normalized.")]
|
|
public int requiredEXP;
|
|
|
|
[Header("Inspector")]
|
|
[Tooltip("Documentation text normalized.")]
|
|
public int skill_slot_limited;
|
|
|
|
[Header("Note-hit shared parameters")]
|
|
[Tooltip("Documentation text normalized.")]
|
|
public int manaGainGood = 1;
|
|
[Tooltip("Documentation text normalized.")]
|
|
public int manaGainGreat = 2;
|
|
[Tooltip("Documentation text normalized.")]
|
|
public int manaGainPerfect = 3;
|
|
[Tooltip("Documentation text normalized.")]
|
|
public int manaGainOnMiss = 5;
|
|
|
|
[Tooltip("Documentation text normalized.")]
|
|
public float damageMultiplierGood = 0.5f;
|
|
[Tooltip("Documentation text normalized.")]
|
|
public float damageMultiplierGreat = 0.75f;
|
|
[Tooltip("Documentation text normalized.")]
|
|
public float damageMultiplierPerfect = 1f;
|
|
|
|
[Tooltip("Documentation text normalized.")]
|
|
public float missHpLossBase = 10f;
|
|
}
|
|
|
|
[Header("Inspector")]
|
|
public int ally_currentEXP;
|
|
|
|
[Header("Skills")]
|
|
public SkillDefinition[] availableSkills;
|
|
[Tooltip("Indexes into availableSkills for preselected skills; empty means none selected")]
|
|
public int[] selectedSkillIndices = new int[0];
|
|
|
|
[Tooltip("Primary selected skill index into availableSkills (-1 = none)")]
|
|
public int primarySkillIndex = -1;
|
|
|
|
// Documentation text normalized.
|
|
|
|
[Tooltip("Skill groups defined on this hero. Each SkillGroup has a numeric skillGroupID which can be equipped into slots to allow activation of the entire group via that ID.")]
|
|
public SkillGroup[] skillGroups = new SkillGroup[0];
|
|
|
|
[Tooltip("Equipped skill group IDs for this ally. Each int references a skillGroupID defined in skillGroups. Use 0 to indicate empty.")]
|
|
public int[] equippedSkillGroupIDs = new int[0];
|
|
|
|
// Documentation text normalized.
|
|
|
|
public SkillDefinition GetPrimarySkill()
|
|
{
|
|
if (availableSkills == null || primarySkillIndex < 0 || primarySkillIndex >= availableSkills.Length) return null;
|
|
return availableSkills[primarySkillIndex];
|
|
}
|
|
|
|
// Adjusted: primary group is no longer stored as an index; prefer the first equipped group ID, otherwise fall back to the first non-null defined group.
|
|
public SkillGroup GetPrimarySkillGroup()
|
|
{
|
|
if (skillGroups == null || skillGroups.Length == 0) return null;
|
|
|
|
// If equipped group IDs exist, prefer the first valid referenced group
|
|
if (equippedSkillGroupIDs != null && equippedSkillGroupIDs.Length > 0)
|
|
{
|
|
foreach (var gid in equippedSkillGroupIDs)
|
|
{
|
|
if (gid == 0) continue;
|
|
var g = GetSkillGroupByID(gid);
|
|
if (g != null) return g;
|
|
}
|
|
}
|
|
|
|
// Fallback: return first non-null skill group defined on the SO
|
|
foreach (var g in skillGroups)
|
|
{
|
|
if (g != null) return g;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
// New helper: find a SkillGroup by its numeric skillGroupID
|
|
public SkillGroup GetSkillGroupByID(int groupID)
|
|
{
|
|
if (skillGroups == null || skillGroups.Length == 0) return null;
|
|
foreach (var g in skillGroups)
|
|
{
|
|
if (g != null && g.skillGroupID == groupID) return g;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// Return the AllyLevelInfo that corresponds to the current ally_currentEXP.
|
|
// Picks the highest level whose requiredEXP <= ally_currentEXP. If none match, returns levelStats[0] if present, otherwise null.
|
|
public AllyLevelInfo GetEffectiveLevelForCurrentEXP()
|
|
{
|
|
if (levelStats == null || levelStats.Count == 0) return null;
|
|
AllyLevelInfo best = null;
|
|
int currentExp = ally_currentEXP;
|
|
foreach (var lvl in levelStats)
|
|
{
|
|
if (lvl == null) continue;
|
|
if (best == null)
|
|
{
|
|
if (currentExp >= lvl.requiredEXP) best = lvl;
|
|
}
|
|
else
|
|
{
|
|
if (currentExp >= lvl.requiredEXP && lvl.requiredEXP >= best.requiredEXP) best = lvl;
|
|
}
|
|
}
|
|
if (best == null) return levelStats[0];
|
|
return best;
|
|
}
|
|
}
|