public Fufillment Produce(Item signature) { // What you are looking for already exists var thing = Things.FirstOrDefault(t => t.SameSignature(signature) && t.ConsumedBy == null); if (thing != null) { var ci = signature as CraftItem; var mi = signature as MonsterItem; if (ci != null) { return(thing); // consumption and subtraction *need* to be handled one level up /* * var ct = thing as CraftItem; * if (ct.Amount >= ci.Amount) * return thing; * else { * var d = Math.Min(ci.Amount, ct.Amount); * ct.Amount -= d; * ci.Amount -= d; * }*/ } if (mi != null && !mi.Monster.Locked) { return(thing); } } // We already have one in the works var act = Actions.FirstOrDefault(a => a.Produces.Any(p => p.SameSignature(signature) && p.ConsumedBy == null)); if (act != null) { return(act); } var acts = Moves.Where(a => a.Produces.Any(p => p.SameSignature(signature))); // somehow pick "the best" way to produce it act = acts.FirstOrDefault(); var ac = new ActionSW(act.Name); // consume and produce foreach (var i in act.Consumes) { var fuf = Produce(i); var fi = fuf as Item; var fa = fuf as ActionSW; if (fi != null) { fi.ConsumedBy = ac; ac.Consumes.Add(fi); } else if (fa != null) { var pi = fa.Produces.FirstOrDefault(p => p.SameSignature(i)); pi.ConsumedBy = ac; ac.Consumes.Add(pi); } else { var ni = i.Copy(); ac.Consumes.Add(ni); } } ac.Fufilled = ac.Consumes.All(c => c.ConsumedBy == ac); Actions.Add(ac); return(ac); }
// easymode public Fufillment Produce(Item signature, double amount) { var ms = signature as MonsterItem; var cs = signature as CraftItem; if (ms != null) { var act = new ActionSW("Make " + amount + " " + ms.Monster.Name); for (int i = 0; i < amount; i++) { var pp = Produce(signature); var pi = (pp as MonsterItem); var pa = (pp as ActionSW); if (pi != null) { pi.ConsumedBy = act; act.Consumes.Add(pi); } else if (pa != null) { var ppi = pa.Produces.FirstOrDefault(p => p.SameSignature(signature)); ppi.ConsumedBy = act; act.Consumes.Add(ppi); } } Actions.Add(act); return(act); } else if (cs != null) { var act = new ActionSW("Make " + amount + " " + cs.Name); cs.Amount = amount; while (cs.Amount > 0) { var pp = Produce(cs); var pi = (pp as CraftItem); var pa = (pp as ActionSW); if (pi != null) { var d = Math.Min(amount, pi.Amount); amount -= d; cs.Amount = amount; if (amount >= 0) { pi.ConsumedBy = act; act.Consumes.Add(pi); } else { pi.Amount -= d; } if (cs.Amount > 0) { pa = (Produce(cs) as ActionSW); } } if (pa != null) { var pai = pa.Produces.FirstOrDefault(p => p.SameSignature(cs)); } } Actions.Add(act); } return(null); }