public void Acquire() { Debug.Assert(status == ESkillStatus.Learnable); status = ESkillStatus.Acquired; // All contradictory skills are now unlearnable foreach (SkillNode n in antireqs) { n.PropagateUnlearnable(); } // All dependents are one skill closer to being learnable foreach (SkillNode n in dependents) { if (n.status == ESkillStatus.Unlearnable) { continue; } n.remainingPrereqs--; // When all prereqs are met the skill is learnable if (n.remainingPrereqs == 0) { GuiOutput.Log(String.Format("{0} is learnable now!", n.type)); n.status = ESkillStatus.Learnable; } } }
private int remainingPrereqs; // Count of unlearnt public SkillNode(EAbility skillType) { type = skillType; status = ESkillStatus.Learnable; prereqs = new List <SkillNode>(); antireqs = new List <SkillNode>(); dependents = new List <SkillNode>(); remainingPrereqs = 0; }
private void PropagateUnlearnable() { Debug.Assert(status != ESkillStatus.Acquired); if (status == ESkillStatus.Unlearnable) { return; } status = ESkillStatus.Unlearnable; GuiOutput.Log(String.Format("{0} is unlearnable now!", type)); // All skills that depend on this skill are now unlearnable foreach (SkillNode n in dependents) { n.PropagateUnlearnable(); } }
public void AddPrereq(SkillNode prereq) { prereqs.Add(prereq); remainingPrereqs++; status = ESkillStatus.MissingPrereq; }