private void ApplyUpgradeEffects(Item item)
{
foreach (var effect in item.GetUpgradeEffects())
{
var stat = effect.Stat.ToStat();
var value = effect.Value;
// Check stat
if (stat == Stat.None)
{
Log.Warning("ApplyUpgradeEffects: Unknown/unhandled stat '{0}'.", effect.Stat);
continue;
}
// Check requirements
var fulfilled = false;
// None
if (effect.CheckType == UpgradeCheckType.None)
{
fulfilled = true;
}
// Stat ==, >, >=, <, <=
else if (effect.CheckType >= UpgradeCheckType.GreaterThan && effect.CheckType <= UpgradeCheckType.Equal)
{
// Check upgrade stat and get value
var valueToCheck = 0;
switch (effect.CheckStat)
{
case UpgradeStat.Level: valueToCheck = _creature.Level; break;
case UpgradeStat.TotalLevel: valueToCheck = _creature.TotalLevel; break;
case UpgradeStat.ExplorationLevel: valueToCheck = 0; break; // TODO: Set once we have exploration levels.
case UpgradeStat.Age: valueToCheck = _creature.Age; break;
default:
Log.Warning("ApplyUpgradeEffects: Unknown/unhandled check stat '{0}'.", effect.CheckStat);
continue;
}
// Check value
switch (effect.CheckType)
{
case UpgradeCheckType.Equal: fulfilled = (valueToCheck == effect.CheckValue); break;
case UpgradeCheckType.GreaterThan: fulfilled = (valueToCheck > effect.CheckValue); break;
case UpgradeCheckType.GreaterEqualThan: fulfilled = (valueToCheck >= effect.CheckValue); break;
case UpgradeCheckType.LowerThan: fulfilled = (valueToCheck < effect.CheckValue); break;
case UpgradeCheckType.LowerEqualThan: fulfilled = (valueToCheck <= effect.CheckValue); break;
}
}
// Skill rank >, <, ==
else if (effect.CheckType >= UpgradeCheckType.SkillRankEqual && effect.CheckType <= UpgradeCheckType.SkillRankLowerThan)
{
var skillId = effect.CheckSkillId;
var skillRank = effect.CheckSkillRank;
var skill = _creature.Skills.Get(effect.CheckSkillId);
if (skill != null)
{
switch (effect.CheckType)
{
case UpgradeCheckType.SkillRankEqual: fulfilled = (skill.Info.Rank == effect.CheckSkillRank); break;
case UpgradeCheckType.SkillRankGreaterThan: fulfilled = (skill.Info.Rank >= effect.CheckSkillRank); break;
case UpgradeCheckType.SkillRankLowerThan: fulfilled = (skill.Info.Rank < effect.CheckSkillRank); break;
}
}
}
// Broken
else if (effect.CheckType == UpgradeCheckType.WhenBroken)
{
fulfilled = (effect.CheckBroken && item.Durability == 0) || (!effect.CheckBroken && item.Durability != 0);
}
// Title
else if (effect.CheckType == UpgradeCheckType.HoldingTitle)
{
fulfilled = (_creature.Titles.SelectedTitle == effect.CheckTitleId);
}
// Condition
else if (effect.CheckType == UpgradeCheckType.InAStateOf)
{
fulfilled = _creature.Conditions.Has(effect.CheckCondition);
}
// PTJ
else if (effect.CheckType == UpgradeCheckType.IfPtjCompletedMoreThan)
{
var trackRecord = _creature.Quests.GetPtjTrackRecord(effect.CheckPtj);
fulfilled = (trackRecord.Done >= effect.CheckValue);
}
// Month
else if (effect.CheckType == UpgradeCheckType.WhileBeing)
{
fulfilled = (ErinnTime.Now.Month == (int)effect.CheckMonth);
}
// Summon
else if (effect.CheckType == UpgradeCheckType.WhileSummoned)
{
switch (effect.CheckStat)
{
case UpgradeStat.Pet: fulfilled = (_creature.Pet != null); break;
case UpgradeStat.Golem: fulfilled = false; break; // TODO: Set once we have golems.
case UpgradeStat.BarrierSpikes: fulfilled = false; break; // TODO: Set once we have barrier spikes.
default:
Log.Warning("ApplyUpgradeEffects: Unknown/unhandled check summon '{0}'.", effect.CheckStat);
continue;
}
}
else
{
Log.Warning("ApplyUpgradeEffects: Unknown/unhandled check type '{0}'.", effect.CheckType);
continue;
}
// Apply if requirements are fulfilled
if (fulfilled)
_creature.StatMods.Add(stat, value, StatModSource.Equipment, item.EntityId);
}
}