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);
            }