item stat generation rules
This commit is contained in:
parent
785284b42e
commit
3dcf585d78
60
Assets/Scripts/Items/Generator/New Stat Rule Set.asset
Normal file
60
Assets/Scripts/Items/Generator/New Stat Rule Set.asset
Normal file
@ -0,0 +1,60 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: b261a15482e5e154c9f86c6cd8b401b5, type: 3}
|
||||
m_Name: New Stat Rule Set
|
||||
m_EditorClassIdentifier: Assembly-CSharp::StatRuleSet
|
||||
ruleSetName: Default Rules
|
||||
description: Describe what this rule set does
|
||||
equipmentRules:
|
||||
- equipmentType: 0
|
||||
ruleName: Helmet Stat Rules
|
||||
statModifiers:
|
||||
- statType: 3
|
||||
modificationType: 0
|
||||
value: 0
|
||||
useCondition: 0
|
||||
conditionDescription:
|
||||
- statType: 4
|
||||
modificationType: 0
|
||||
value: 0
|
||||
useCondition: 0
|
||||
conditionDescription:
|
||||
- statType: 16
|
||||
modificationType: 0
|
||||
value: 0
|
||||
useCondition: 0
|
||||
conditionDescription:
|
||||
- statType: 17
|
||||
modificationType: 0
|
||||
value: 0
|
||||
useCondition: 0
|
||||
conditionDescription:
|
||||
- statType: 13
|
||||
modificationType: 1
|
||||
value: 2
|
||||
useCondition: 0
|
||||
conditionDescription:
|
||||
- statType: 14
|
||||
modificationType: 1
|
||||
value: 1.5
|
||||
useCondition: 0
|
||||
conditionDescription:
|
||||
- statType: 9
|
||||
modificationType: 1
|
||||
value: 1.5
|
||||
useCondition: 0
|
||||
conditionDescription:
|
||||
mandatoryStats: 0d000000
|
||||
forbiddenStats: 03000000040000001000000011000000
|
||||
weaponRules: []
|
||||
relationshipRules: []
|
||||
tierRules: []
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0e0fedd18e1c7d84bbcb311bc1744ae6
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
261
Assets/Scripts/Items/Generator/StatRuleSet.cs
Normal file
261
Assets/Scripts/Items/Generator/StatRuleSet.cs
Normal file
@ -0,0 +1,261 @@
|
||||
using Kryz.CharacterStats.Examples;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
[CreateAssetMenu(fileName = "New Stat Rule Set", menuName = "RiftMayhem/Stat Rule Set")]
|
||||
public class StatRuleSet : ScriptableObject
|
||||
{
|
||||
[Header("Rule Set Info")]
|
||||
public string ruleSetName = "Default Rules";
|
||||
[TextArea(2, 4)]
|
||||
public string description = "Describe what this rule set does";
|
||||
|
||||
[Header("Equipment Type Rules")]
|
||||
public List<EquipmentTypeRule> equipmentRules = new List<EquipmentTypeRule>();
|
||||
|
||||
[Header("Weapon Type Rules")]
|
||||
public List<WeaponTypeRule> weaponRules = new List<WeaponTypeRule>();
|
||||
|
||||
[Header("Global Stat Relationships")]
|
||||
public List<StatRelationshipRule> relationshipRules = new List<StatRelationshipRule>();
|
||||
|
||||
[Header("Tier Rules")]
|
||||
public List<TierRule> tierRules = new List<TierRule>();
|
||||
|
||||
// Method to get effective weights after applying all rules
|
||||
public EquippableItemGenerator.StatWeights GetEffectiveWeights(EquipmentType equipmentType, WeaponType? weaponType,
|
||||
EquippableItemGenerator.ItemTier tier, HashSet<CharacterStatType> alreadyRolledStats = null)
|
||||
{
|
||||
// Start with base weights (you might want to store base weights in the rule set too)
|
||||
EquippableItemGenerator.StatWeights effectiveWeights = new EquippableItemGenerator.StatWeights();
|
||||
|
||||
// Apply equipment type rules
|
||||
ApplyEquipmentRules(effectiveWeights, equipmentType);
|
||||
|
||||
// Apply weapon type rules if it's a weapon
|
||||
if (weaponType.HasValue)
|
||||
{
|
||||
ApplyWeaponRules(effectiveWeights, weaponType.Value);
|
||||
}
|
||||
|
||||
// Apply tier rules
|
||||
ApplyTierRules(effectiveWeights, tier);
|
||||
|
||||
// Apply relationship rules based on already rolled stats
|
||||
if (alreadyRolledStats != null)
|
||||
{
|
||||
ApplyRelationshipRules(effectiveWeights, alreadyRolledStats);
|
||||
}
|
||||
|
||||
return effectiveWeights;
|
||||
}
|
||||
|
||||
private void ApplyEquipmentRules(EquippableItemGenerator.StatWeights weights, EquipmentType equipmentType)
|
||||
{
|
||||
foreach (var rule in equipmentRules)
|
||||
{
|
||||
if (rule.equipmentType == equipmentType)
|
||||
{
|
||||
rule.ApplyRule(weights);
|
||||
break; // Only apply the first matching rule
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyWeaponRules(EquippableItemGenerator.StatWeights weights, WeaponType weaponType)
|
||||
{
|
||||
foreach (var rule in weaponRules)
|
||||
{
|
||||
if (rule.weaponType == weaponType)
|
||||
{
|
||||
rule.ApplyRule(weights);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyTierRules(EquippableItemGenerator.StatWeights weights, EquippableItemGenerator.ItemTier tier)
|
||||
{
|
||||
foreach (var rule in tierRules)
|
||||
{
|
||||
if (rule.tier == tier)
|
||||
{
|
||||
rule.ApplyRule(weights);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyRelationshipRules(EquippableItemGenerator.StatWeights weights, HashSet<CharacterStatType> alreadyRolledStats)
|
||||
{
|
||||
foreach (var rule in relationshipRules)
|
||||
{
|
||||
if (alreadyRolledStats.Contains(rule.triggerStat))
|
||||
{
|
||||
rule.ApplyRule(weights);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[System.Serializable]
|
||||
public class EquipmentTypeRule
|
||||
{
|
||||
public EquipmentType equipmentType;
|
||||
public string ruleName = "";
|
||||
|
||||
[Header("Stat Modifications")]
|
||||
public StatModifierRule[] statModifiers;
|
||||
|
||||
[Header("Mandatory Stats")]
|
||||
public CharacterStatType[] mandatoryStats;
|
||||
|
||||
[Header("Forbidden Stats")]
|
||||
public CharacterStatType[] forbiddenStats;
|
||||
|
||||
public void ApplyRule(EquippableItemGenerator.StatWeights weights)
|
||||
{
|
||||
// Apply forbidden stats (set to 0)
|
||||
foreach (CharacterStatType forbiddenStat in forbiddenStats)
|
||||
{
|
||||
SetStatWeight(weights, forbiddenStat, 0f);
|
||||
}
|
||||
|
||||
// Apply stat modifications
|
||||
foreach (var modifier in statModifiers)
|
||||
{
|
||||
float currentWeight = GetStatWeight(weights, modifier.statType);
|
||||
float newWeight = modifier.modificationType switch
|
||||
{
|
||||
ModificationType.Set => modifier.value,
|
||||
ModificationType.Multiply => currentWeight * modifier.value,
|
||||
ModificationType.Add => currentWeight + modifier.value,
|
||||
_ => currentWeight
|
||||
};
|
||||
SetStatWeight(weights, modifier.statType, newWeight);
|
||||
}
|
||||
}
|
||||
|
||||
private float GetStatWeight(EquippableItemGenerator.StatWeights weights, CharacterStatType statType)
|
||||
{
|
||||
return statType switch
|
||||
{
|
||||
CharacterStatType.AttackDamage => weights.attackDamage,
|
||||
CharacterStatType.SpellDamage => weights.spellDamage,
|
||||
CharacterStatType.CritChance => weights.critChance,
|
||||
CharacterStatType.CritDamage => weights.critDamage,
|
||||
CharacterStatType.MaxHealth => weights.maxHealth,
|
||||
CharacterStatType.Armor => weights.armor,
|
||||
CharacterStatType.MagicResistance => weights.magicResistance,
|
||||
CharacterStatType.DodgeChance => weights.dodgeChance,
|
||||
CharacterStatType.BlockChance => weights.blockChance,
|
||||
CharacterStatType.BlockEffectiveness => weights.blockEffectiveness,
|
||||
CharacterStatType.HealthRegen => weights.healthRegen,
|
||||
CharacterStatType.MaxMana => weights.maxMana,
|
||||
CharacterStatType.ManaRegen => weights.manaRegen,
|
||||
CharacterStatType.AttackSpeed => weights.attackSpeed,
|
||||
CharacterStatType.AreaEffectiveness => weights.areaEffectiveness,
|
||||
CharacterStatType.CooldownReduction => weights.cooldownReduction,
|
||||
CharacterStatType.MovementSpeed => weights.movementSpeed,
|
||||
CharacterStatType.ReputationGainIncrease => weights.reputationGain,
|
||||
CharacterStatType.GoldCostReduction => weights.goldCostReduction,
|
||||
// Note: Cunning, Flow, Presence, AuraPower don't seem to be in StatWeights
|
||||
// You might need to add these to StatWeights or handle them separately
|
||||
_ => 0f
|
||||
};
|
||||
}
|
||||
|
||||
private void SetStatWeight(EquippableItemGenerator.StatWeights weights, CharacterStatType statType, float value)
|
||||
{
|
||||
switch (statType)
|
||||
{
|
||||
case CharacterStatType.AttackDamage: weights.attackDamage = value; break;
|
||||
case CharacterStatType.SpellDamage: weights.spellDamage = value; break;
|
||||
case CharacterStatType.CritChance: weights.critChance = value; break;
|
||||
case CharacterStatType.CritDamage: weights.critDamage = value; break;
|
||||
case CharacterStatType.MaxHealth: weights.maxHealth = value; break;
|
||||
case CharacterStatType.Armor: weights.armor = value; break;
|
||||
case CharacterStatType.MagicResistance: weights.magicResistance = value; break;
|
||||
case CharacterStatType.DodgeChance: weights.dodgeChance = value; break;
|
||||
case CharacterStatType.BlockChance: weights.blockChance = value; break;
|
||||
case CharacterStatType.BlockEffectiveness: weights.blockEffectiveness = value; break;
|
||||
case CharacterStatType.HealthRegen: weights.healthRegen = value; break;
|
||||
case CharacterStatType.MaxMana: weights.maxMana = value; break;
|
||||
case CharacterStatType.ManaRegen: weights.manaRegen = value; break;
|
||||
case CharacterStatType.AttackSpeed: weights.attackSpeed = value; break;
|
||||
case CharacterStatType.AreaEffectiveness: weights.areaEffectiveness = value; break;
|
||||
case CharacterStatType.CooldownReduction: weights.cooldownReduction = value; break;
|
||||
case CharacterStatType.MovementSpeed: weights.movementSpeed = value; break;
|
||||
case CharacterStatType.ReputationGainIncrease: weights.reputationGain = value; break;
|
||||
case CharacterStatType.GoldCostReduction: weights.goldCostReduction = value; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[System.Serializable]
|
||||
public class WeaponTypeRule
|
||||
{
|
||||
public WeaponType weaponType;
|
||||
public string ruleName = "";
|
||||
public StatModifierRule[] statModifiers;
|
||||
public CharacterStatType[] mandatoryStats;
|
||||
public CharacterStatType[] forbiddenStats;
|
||||
|
||||
public void ApplyRule(EquippableItemGenerator.StatWeights weights)
|
||||
{
|
||||
// Same implementation as EquipmentTypeRule
|
||||
// (Could extract to a base class if you want)
|
||||
}
|
||||
}
|
||||
|
||||
[System.Serializable]
|
||||
public class StatRelationshipRule
|
||||
{
|
||||
public CharacterStatType triggerStat;
|
||||
public string ruleName = "";
|
||||
[Header("When this stat is present, modify these:")]
|
||||
public StatModifierRule[] statModifications;
|
||||
|
||||
public void ApplyRule(EquippableItemGenerator.StatWeights weights)
|
||||
{
|
||||
foreach (var modifier in statModifications)
|
||||
{
|
||||
// Apply modification logic here
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[System.Serializable]
|
||||
public class TierRule
|
||||
{
|
||||
public EquippableItemGenerator.ItemTier tier;
|
||||
public string ruleName = "";
|
||||
public StatModifierRule[] statModifiers;
|
||||
public CharacterStatType[] unlockedStats; // Stats that become available at this tier
|
||||
|
||||
public void ApplyRule(EquippableItemGenerator.StatWeights weights)
|
||||
{
|
||||
foreach (var modifier in statModifiers)
|
||||
{
|
||||
// Apply tier-based modifications
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[System.Serializable]
|
||||
public class StatModifierRule
|
||||
{
|
||||
public CharacterStatType statType;
|
||||
public ModificationType modificationType;
|
||||
public float value;
|
||||
|
||||
[Header("Optional: Condition")]
|
||||
public bool useCondition = false;
|
||||
public string conditionDescription = "";
|
||||
}
|
||||
|
||||
public enum ModificationType
|
||||
{
|
||||
Set, // Set weight to exact value
|
||||
Multiply, // Multiply current weight
|
||||
Add // Add to current weight
|
||||
}
|
||||
2
Assets/Scripts/Items/Generator/StatRuleSet.cs.meta
Normal file
2
Assets/Scripts/Items/Generator/StatRuleSet.cs.meta
Normal file
@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b261a15482e5e154c9f86c6cd8b401b5
|
||||
Loading…
x
Reference in New Issue
Block a user