protected void FinishItem(Creature creature, Skill skill, ManualData manualData, int finishId, Item item, int quality)
{
var finish = manualData.GetFinish(finishId);
if (finish == null)
{
Log.Error("CreationSkill.FinishItem: Finish '{0}' not found.", finishId);
Send.ServerMessage(creature, Localization.Get("Unknown finish recipe, please report."));
return;
}
// Monday: Increase in quality of output for productions.
// +5, unofficial.
if (ErinnTime.Now.Month == ErinnMonth.AlbanEiler)
quality = Math.Min(100, quality + 5);
// Update item
item.OptionInfo.Flags &= ~ItemFlags.Incomplete;
item.OptionInfo.Flags |= ItemFlags.Reproduction;
item.MetaData1.Remove(ProgressVar);
item.MetaData1.Remove(StclmtVar);
item.MetaData1.SetInt(QualityVar, quality);
if (finish.Color1 != null) item.Info.Color1 = (uint)finish.Color1;
if (finish.Color2 != null) item.Info.Color2 = (uint)finish.Color2;
if (finish.Color3 != null) item.Info.Color3 = (uint)finish.Color3;
// Signature
if (skill.Info.Rank >= SkillRank.R9 && manualData.Rank >= SkillRank.RA && quality >= 80)
{
item.MetaData1.SetString(SignNameVar, creature.Name);
item.MetaData1.SetByte(SignRankVar, (byte)skill.Info.Rank);
}
// Get quality based msg
var msg = "";
if (quality == 100) // god
{
msg = Localization.Get("You created a godly {0}! Excellent work!");
}
else if (quality >= 80) // best
{
msg = Localization.Get("Your hard work produced a very nice {0}!");
}
else if (quality >= 50) // better
{
msg = Localization.Get("Your efforts created an above-average {0}!");
}
else if (quality >= 20) // reasonable
{
msg = Localization.Get("Your creation is far superior to anything you can get from a store.");
}
else if (quality >= -20) // normal
{
msg = Localization.Get("Your creation is just as good as anything you can get from a store.");
}
else if (quality >= -50) // worse
{
msg = Localization.Get("Your creation could be nice with a few repairs.");
}
else if (quality >= -80) // worst
{
msg = Localization.Get("You managed to finish the {0}, but it's pretty low quality.");
}
else
{
msg = Localization.Get("Your {0} isn't really fit for use. Maybe you could get some decent scrap wood out of it.");
}
// Apply bonuses and append msgs
var bonuses = this.GetBonusesFor(item, quality);
if (bonuses.Count != 0)
{
msg += "\n";
foreach (var bonus in bonuses)
{
var bonusName = "?";
switch (bonus.Key)
{
case Bonus.Defense:
item.OptionInfo.Defense += bonus.Value;
bonusName = "Defense";
break;
case Bonus.Protection:
item.OptionInfo.Protection += (short)bonus.Value;
bonusName = "Protection";
break;
case Bonus.Durability:
item.OptionInfo.Durability += bonus.Value * 1000;
bonusName = "Durability";
break;
case Bonus.DurabilityMax:
item.OptionInfo.DurabilityMax += bonus.Value * 1000;
bonusName = "Max Durability";
break;
case Bonus.AttackMin:
item.OptionInfo.AttackMin += (ushort)bonus.Value;
bonusName = "Min Attack";
break;
case Bonus.AttackMax:
item.OptionInfo.AttackMax += (ushort)bonus.Value;
bonusName = "Max Attack";
break;
case Bonus.Critical:
item.OptionInfo.Critical += (sbyte)bonus.Value;
bonusName = "Critical";
break;
case Bonus.Balance:
item.OptionInfo.Balance += (byte)bonus.Value;
bonusName = "Balance";
break;
}
if (bonus.Value > 0)
msg += string.Format("{0} Increase {1}, ", bonusName, bonus.Value);
else
msg += string.Format("{0} Decrease {1}, ", bonusName, bonus.Value);
}
msg = msg.TrimEnd(',', ' ');
// Check attack
if (item.OptionInfo.AttackMin > item.OptionInfo.AttackMax)
item.OptionInfo.AttackMin = item.OptionInfo.AttackMax;
// Check durability
if (item.OptionInfo.Durability > item.OptionInfo.DurabilityMax)
item.OptionInfo.Durability = item.OptionInfo.DurabilityMax;
}
// Send notice
Send.Notice(creature, msg, item.Data.Name);
}