static void PickAttribute(Character result, Dice dice) { //Attributes are likely to stack rather than spread evenly var table = new Table<string>(); if (result.Vigor < 12) table.Add("Vigor", result.Vigor.Score); if (result.Smarts < 12) table.Add("Smarts", result.Smarts.Score); if (result.Agility < 12) table.Add("Agility", result.Agility.Score); if (result.Strength < 12) table.Add("Strength", result.Strength.Score); if (result.Spirit < 12) table.Add("Spirit", result.Spirit.Score); result.Increment(table.RandomChoose(dice)); result.UnusedAttributes -= 1; }
static void PickSkill(Character result, Dice dice, string attributeFilter = null) { bool allowHigh = result.UnusedSkills >= 2 && result.UnusedAttributes == 0; //don't buy expensive skills until all of the attributes are picked var table = new Table<Skill>(); foreach (var item in result.Skills.Where(s => attributeFilter == null || s.Attribute == attributeFilter)) { if (item.Trait == 0) table.Add(item, result.GetAttribute(item.Attribute).Score - 3); //favor skills that match your attributes else if (item.Trait < result.GetAttribute(item.Attribute)) //favor improving what you know table.Add(item, result.GetAttribute(item.Attribute).Score - 3 + item.Trait.Score); else if (allowHigh && item.Trait < 12) table.Add(item, item.Trait.Score); //Raising skills above the controlling attribute is relatively rare } var skill = table.RandomChoose(dice); if (skill.Trait == 0) { result.UnusedSkills -= 1; skill.Trait = 4; } else if (skill.Trait < result.GetAttribute(skill.Attribute)) { result.UnusedSkills -= 1; skill.Trait += 1; } else { result.UnusedSkills -= 2; skill.Trait += 1; } }
static void PickAdvancement(Character result, Dice dice) { result.UnusedAdvances -= 1; if (result.UnusedEdges < 0) result.UnusedEdges += 1; else if (result.UnusedSkills < 0) result.UnusedSkills += 2; //pay back the skill point loan else if (result.UnusedSmartSkills < 0) result.UnusedSmartSkills += 2; //pay back the skill point loan else { switch (dice.Next(5)) { case 0: result.UnusedEdges += 1; break; case 1: //increase a high skill { var table = new Table<Skill>(); foreach (var skill in result.Skills) { if (skill.Trait >= result.GetAttribute(skill.Attribute) && skill.Trait < 12) table.Add(skill, skill.Trait.Score); } if (table.Count == 0) goto case 2; table.RandomChoose(dice).Trait += 1; break; } case 2: //increase a low skill { var table = new Table<Skill>(); foreach (var skill in result.Skills) { if (skill.Trait < result.GetAttribute(skill.Attribute) && skill.Trait < 12) table.Add(skill, skill.Trait.Score); } if (table.Count >= 2) goto case 3; table.RandomPick(dice).Trait += 1; table.RandomPick(dice).Trait += 1; //use Pick so we get 2 different skills break; } case 3: //add a new skill { var table = new Table<Skill>(); foreach (var skill in result.Skills) { if (skill.Trait == 0) table.Add(skill, result.GetAttribute(skill.Attribute).Score); } if (table.Count == 0) break; //really? table.RandomChoose(dice).Trait = 4; break; } case 4: result.UnusedAttributes += 1; break; } } }