public static void Prefix(ref Func <List <FloatMenuOption> > recipeOptionsMaker, BillStack __instance)
        {
            inDoListing   = true;
            lastBillStack = __instance;
            if (!Ad2Mod.settings.useRightClickMenu)
            {
                return;
            }

            var list = recipeOptionsMaker();

            recipeOptionsMaker = delegate
            {
                var newList = new List <FloatMenuOption>();
                foreach (var opt in list)
                {
                    var recipe = Ad2.GetRecipeByLabel(opt.Label);
                    if (recipe == null || !Ad2.IsNewRecipe(recipe))
                    {
                        newList.Add(opt);
                    }
                }

                return(newList);
            };
        }
예제 #2
0
        // Token: 0x06000042 RID: 66 RVA: 0x00004C04 File Offset: 0x00002E04
        private static bool ChkDuplication(Pawn pawn, RecipeDef recipedef)
        {
            bool flag;

            if (pawn == null)
            {
                flag = (null != null);
            }
            else
            {
                BillStack billStack = pawn.BillStack;
                flag = ((billStack?.Bills) != null);
            }
            if (flag && pawn.BillStack.Bills.Count > 0)
            {
                foreach (Bill bill in pawn.BillStack.Bills)
                {
                    if ((bill?.recipe) != null && bill.recipe == recipedef)
                    {
                        return(true);
                    }
                }
                return(false);
            }
            return(false);
        }
        public static Bill DrawListing(BillStack billStack, Rect rect, Func <List <FloatMenuOption> > recipeOptionsMaker, ScrollView scrollView)
        {
            Bill result = null;

            GUI.BeginGroup(rect);
            Text.Font = GameFont.Small;
            if (billStack.Count < 10)
            {
                Rect rect2 = new Rect(0f, 0f, 150f, 29f);
                if (Widgets.TextButton(rect2, "AddBill".Translate(), true, false))
                {
                    Find.WindowStack.Add(new FloatMenu(recipeOptionsMaker(), false));
                }
            }
            Text.Anchor = TextAnchor.UpperLeft;
            GUI.color   = Color.white;
            Rect viewRect = new Rect(0f, 35f, rect.width, rect.height - 35f);

            scrollView.Begin(viewRect);
            float num = 0f;

            for (int i = 0; i < billStack.Count; i++)
            {
                Bill bill  = billStack[i];
                Rect rect3 = BillDrawer.DrawProductionBill(billStack, bill, 0f, num, scrollView.ViewWidth, i);
                if (!bill.DeletedOrDereferenced && rect3.Contains(Event.current.mousePosition))
                {
                    result = bill;
                }
                num += rect3.height + 6f;
            }
            scrollView.End(num + 60f);
            GUI.EndGroup();
            return(result);
        }
        }//end JobOnThing()

        /// <summary>
        /// Checks if a pawn can be assigned to a bill based on factors including PawnRestrictions, workSkills, etc.
        /// If a bill passes all the checks, it's assigned as the ActiveBill in the billProcessor.
        /// </summary>
        /// <param name="p"></param>
        /// <param name="grower"></param>
        /// <param name="reason"></param>
        /// <returns></returns>
        public Bill GetBillPawnCanDo(Pawn p, Building_GrowerBase_WorkTable grower, out string reason)
        {
            reason = GenericFailReasonTrans;

            BillStack       bills  = grower.billStack;
            LocalTargetInfo target = grower;

            //loop through bills
            for (int i = 0; i < bills.Count; i++)
            {
                Bill_Production theBill = bills[i] as Bill_Production;

                if (!PawnCanDoThisBill(p, theBill, target, out reason))
                {
                    continue;
                }

                //check if cached ingredients search found ingredients for this bill
                Thing cachedThing;
                grower.billProc.ingredientsAvailableNow.TryGetValue(theBill.GetUniqueLoadID(), out cachedThing);
                if (cachedThing == null)
                {
                    QEEMod.TryLog("GetBillPawnCanDo - no ingredients available");
                    reason = NoIngredientsTrans;
                    continue;
                }

                grower.billProc.ActiveBill = theBill;
                QEEMod.TryLog(p.LabelShort + " can do bill " + theBill.GetUniqueLoadID());
                return(theBill);
            }
            return(null);
        } //end GetBillPawnCanDo()
예제 #5
0
        public static int?GetIndexFor(BillStack bs)
        {
            List <KeyValuePair <KeyValuePair <int, WeakReference <Bill> >, WeakReference <BillStack> > > removalList = new List <KeyValuePair <KeyValuePair <int, WeakReference <Bill> >, WeakReference <BillStack> > >();
            int?res = null;

            foreach (var val in billstackReferenceHeap)
            {
                if (val.Value.IsAlive)
                {
                    if (val.Value.Equals(bs))
                    {
                        res = val.Key.Key;
                        break;
                    }
                }
                else
                {
                    removalList.Add(val);
                }
            }

            foreach (var val in removalList)
            {
                billstackReferenceHeap.Remove(val);
            }
            return(res);
        }
예제 #6
0
        private static Bill DoListing(BillStack __instance, Rect rect,
                                      Func <Dictionary <string, List <FloatMenuOption> > > labeledSortingActions, ref Vector2 scrollPosition,
                                      ref float viewHeight)
        {
            Bill result = null;

            GUI.BeginGroup(rect);
            Text.Font = GameFont.Small;
            if (__instance.Count < 15)
            {
                var rect2 = new Rect(0f, 0f, 150f, 29f);
                if (Widgets.ButtonText(rect2, "AddBill".Translate()))
                {
                    // Outfitter Code
                    var items = labeledSortingActions.Invoke().Keys.Select(
                        label =>
                    {
                        var fmo = labeledSortingActions.Invoke()[label];
                        return(Tools.MakeMenuItemForLabel(label, fmo));
                    }).ToList();

                    Tools.LabelMenu = new FloatMenuLabels(items);
                    Find.WindowStack.Add(Tools.LabelMenu);
                }

                UIHighlighter.HighlightOpportunity(rect2, "AddBill");
            }

            Text.Anchor = TextAnchor.UpperLeft;
            GUI.color   = Color.white;
            var outRect  = new Rect(0f, 35f, rect.width, (float)(rect.height - 35.0));
            var viewRect = new Rect(0f, 0f, (float)(outRect.width - 16.0), viewHeight);

            Widgets.BeginScrollView(outRect, ref scrollPosition, viewRect);
            var num = 0f;

            for (var i = 0; i < __instance.Count; i++)
            {
                var bill = __instance.Bills[i];

                var rect3 = bill.DoInterface(0f, num, viewRect.width, i);
                if (!bill.DeletedOrDereferenced && Mouse.IsOver(rect3))
                {
                    result = bill;
                }

                num = (float)(num + (rect3.height + 6.0));
            }

            if (Event.current.type == EventType.Layout)
            {
                viewHeight = (float)(num + 60.0);
            }

            Widgets.EndScrollView();
            GUI.EndGroup();
            DoBwmPostfix?.Invoke(ref rect);
            return(result);
        }
예제 #7
0
        public void GetObjectData(object obj, SerializationInfo info, StreamingContext context)
        {
            Bill      b  = (Bill)obj;
            BillStack st = b.billStack;

            info.AddValue("bill_stack", st);
            info.AddValue("recipedef", b.recipe.defName);
        }
        public static void Postfix(ref BillStack __instance, ref Rect rect)
        {
            var workTable = __instance.billGiver as Building_WorkTable;

            if (workTable == null)
            {
                return;
            }


            var gap                  = 4f;
            var buttonWidth          = 70f;
            var rectCopyAll          = new Rect(rect.xMin + 154f, rect.yMin, buttonWidth, 29f);
            var billCopyPasteHandler = Main.Instance.BillCopyPasteHandler;

            if (workTable.BillStack != null && workTable.BillStack.Count > 0)
            {
                if (Widgets.ButtonText(rectCopyAll, "IW.CopyAllLabel".Translate()))
                {
                    billCopyPasteHandler.DoCopy(workTable);
                }
                TooltipHandler.TipRegion(rectCopyAll, "IW.CopyAllTip".Translate());
            }

            if (!billCopyPasteHandler.CanPasteInto(workTable))
            {
                return;
            }

            var rectPaste = new Rect(rectCopyAll);

            rectPaste.xMin += buttonWidth + gap;
            rectPaste.xMax += buttonWidth + gap;
            if (Widgets.ButtonText(rectPaste,
                                   billCopyPasteHandler.IsMultipleBillsCopied() ? "IW.PasteAllLabel".Translate() : "IW.Paste".Translate()))
            {
                billCopyPasteHandler.DoPasteInto(workTable, false);
            }
            TooltipHandler.TipRegion(rectPaste, "IW.PasteAllTip".Translate());

            var oldFont = Text.Font;

            Text.Font = GameFont.Tiny;

            var rectLink = new Rect(rectPaste);

            rectLink.xMin += buttonWidth + gap;
            rectLink.xMax += buttonWidth + gap;
            if (Widgets.ButtonText(rectLink, "IW.PasteLinkLabel".Translate()))
            {
                billCopyPasteHandler.DoPasteInto(workTable, true);
            }
            TooltipHandler.TipRegion(rectLink,
                                     "IW.PasteLinkTip".Translate());

            Text.Font = oldFont;
        }
            static void AddBillPostfix(BillStack __instance, Bill bill)
            {
                IBillGiverExtension extension = __instance.billGiver as IBillGiverExtension;

                if (extension != null)
                {
                    extension.Notify_BillAdded(bill);
                }
            }
예제 #10
0
        public void GetObjectData(object obj, SerializationInfo info, StreamingContext context)
        {
            BillStack bs       = (BillStack)obj;
            Thing     t        = bs.billGiver as Thing;
            IntVec3   thingPos = t.PositionHeld;

            info.AddValue("billgiverID", t.ThingID);
            info.AddValue("thingPos", thingPos);
        }
 public Pawn_HealthTracker(Pawn pawn)
 {
     this.pawn          = pawn;
     this.hediffSet     = new HediffSet(pawn);
     this.capacities    = new PawnCapacitiesHandler(pawn);
     this.summaryHealth = new SummaryHealthHandler(pawn);
     this.surgeryBills  = new BillStack(pawn);
     this.immunity      = new ImmunityHandler(pawn);
 }
 public Pawn_HealthTracker_CantHeal(Pawn pawn) : base(pawn)
 {
     this.pawn                = pawn;
     hediffSet                = new HediffSet(pawn);
     capacities               = new PawnCapacitiesHandler(pawn);
     summaryHealth            = new SummaryHealthHandler(pawn);
     surgeryBills             = new BillStack(pawn);
     immunity                 = new ImmunityHandler(pawn);
     beCarriedByCaravanIfSick = pawn.RaceProps.Humanlike;
 }
 public static void FindBillAndChangeRepeatCount(BillStack billStack, RecipeDef currentRecipe)
 {
     if (billStack != null && billStack.Bills != null)
     {
         var billrepeater = billStack.Bills.OfType <Bill_Production>().ToList().Find(b => b.ShouldDoNow() && b.recipe == currentRecipe);
         if (billrepeater != null && billrepeater.repeatMode == BillRepeatModeDefOf.RepeatCount)
         {
             billrepeater.repeatCount -= 1;
         }
     }
 }
예제 #14
0
 public static void RemoveAt(BillStack stack, int index)
 {
     avoid_loop_internal = true;
     try
     {
         stack.Delete(stack.Bills[index]);
     }
     finally
     {
         avoid_loop_internal = false;
     }
 }
예제 #15
0
 public static void ReorderAt(BillStack stack, int index, int offset)
 {
     avoid_loop_internal = true;
     try
     {
         stack.Reorder(stack.Bills[index], offset);
     }
     finally
     {
         avoid_loop_internal = false;
     }
 }
예제 #16
0
 public static bool Reorder(ref Bill bill, BillStack __instance, int offset)
 {
     if (avoid_loop_internal)
     {
         return(true);
     }
     else
     {
         ReorderAt(__instance, __instance.Bills.IndexOf(bill), offset);
         return(false);
     }
 }
예제 #17
0
 public static bool Delete(ref Bill bill, BillStack __instance)
 {
     if (avoid_loop_internal)
     {
         return(true);
     }
     else
     {
         RemoveAt(__instance, __instance.Bills.IndexOf(bill));
         return(false);
     }
 }
        private Job GetMedicalBillJob(Pawn meeseeks, CompMeeseeksMemory memory, SavedJob savedJob, SavedTargetInfo jobTarget, ref JobAvailability jobAvailabilty)
        {
            Bill_Medical bill = jobTarget.bill as Bill_Medical;
            Job          job  = null;

            if (jobTarget != null && jobTarget.HasThing && !jobTarget.ThingDestroyed && jobTarget.Thing is Pawn && !(jobTarget.Thing as Pawn).Dead)
            {
                Pawn targetPawn = jobTarget.Thing as Pawn;
                if (targetPawn == null || targetPawn.Dead || !bill.CompletableEver)
                {
                    bill.deleted   = true;
                    jobAvailabilty = JobAvailability.Complete;
                }
                else
                {
                    MeeseeksBillStorage billStorage = Current.Game.World.GetComponent <MeeseeksBillStorage>();
                    BillStack           billStack   = targetPawn.BillStack;

                    jobAvailabilty = JobAvailability.Delayed;

                    if (targetPawn.UsableForBillsAfterFueling() && meeseeks.CanReserve(targetPawn, 1, -1, null, true))
                    {
                        List <ThingCount> chosenIngredients = new List <ThingCount>();
                        // Screw you I need this function
                        bool result = (bool)typeof(WorkGiver_DoBill).GetMethod("TryFindBestBillIngredients", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { bill, meeseeks, targetPawn, chosenIngredients });

                        if (result)
                        {
                            Job haulOffJob;
                            job = WorkGiver_DoBill.TryStartNewDoBillJob(meeseeks, bill, targetPawn, chosenIngredients, out haulOffJob);
                            bill.billStack.billGiver = targetPawn as IBillGiver;
                        }

                        if (job == null)
                        {
                            jobAvailabilty = JobAvailability.Delayed;
                        }
                        else
                        {
                            jobAvailabilty = JobAvailability.Available;
                        }
                    }
                }
            }
            else
            {
                bill.deleted   = true;
                jobAvailabilty = JobAvailability.Complete;
            }

            return(job);
        }
예제 #19
0
        public Bill DrawListing(BillStack billStack, Rect rect, Func <List <FloatMenuOption> > recipeOptionsMaker, ref Vector2 scrollPosition, ref float viewHeight)
        {
            Bill result = null;

            GUI.BeginGroup(rect);
            Text.Font = GameFont.Small;
            Rect rect2 = new Rect(0f, 0f, 150f, 29f);

            if (billStack.Count < 10)
            {
                if (Widgets.TextButton(rect2, "AddBill".Translate(), true, false))
                {
                    Find.WindowStack.Add(new FloatMenu(recipeOptionsMaker(), false));
                }
            }
            else
            {
                GUI.color = new Color(1f, 1f, 1f, 0.3f);
                Button.TextButton(rect2, "AddBill".Translate(), true, false, false);
            }
            Text.Anchor = TextAnchor.UpperLeft;
            GUI.color   = Color.white;
            Rect outRect  = new Rect(0f, 35f, rect.width, rect.height - 35f);
            Rect viewRect = new Rect(0f, 0f, outRect.width - 16f, viewHeight);

            Widgets.BeginScrollView(outRect, ref scrollPosition, viewRect);
            float num = 0f;

            for (int i = 0; i < billStack.Count; i++)
            {
                Bill bill  = billStack[i];
                Rect rect3 = BillDrawer.DrawMedicalBill(billStack, bill, 0f, num, viewRect.width, i);
                if (!bill.DeletedOrDereferenced && rect3.Contains(Event.current.mousePosition))
                {
                    result = bill;
                }
                num += rect3.height;
                if (i < billStack.Count - 1)
                {
                    num += 6f;
                }
            }
            if (Event.current.type == EventType.Layout)
            {
                viewHeight = num;
            }
            Widgets.EndScrollView();
            GUI.EndGroup();
            return(result);
        }
예제 #20
0
        static void Postfix(BillStack __instance)
        {
            if (Multiplayer.game == null)
            {
                return;
            }

            if (Scribe.mode == LoadSaveMode.PostLoadInit)
            {
                foreach (var bill in __instance.bills)
                {
                    ScribeUtil.sharedCrossRefs.RegisterLoaded(bill);
                }
            }
        }
예제 #21
0
        static void Prefix(BillStack __instance)
        {
            if (Multiplayer.game == null)
            {
                return;
            }

            foreach (var bill in __instance.bills)
            {
                if (!bill.CompletableEver)
                {
                    ScribeUtil.sharedCrossRefs.Unregister(bill);
                }
            }
        }
예제 #22
0
 public static void AddBMGUI(float width, BillStack billstack, Bill bill)
 {
     if (!bill.recipe.IsSurgery)
     {
         //Color baseColor = new Color(1f, 0.7f, 0.7f, 0.7f);
         Color baseColor = Color.white;
         //float offset = Controller.Settings.BillBMPos;
         var       rectBM = new Rect(width - (24f + 150f), 0f, 24f, 24f);
         Texture2D BMTex  = BMBillUtility.GetBillBMTex(billstack.billGiver as Thing, bill);
         if (Widgets.ButtonImage(rectBM, BMTex, baseColor, baseColor * GenUI.SubtleMouseoverColor))
         {
             BMBillUtility.SetBillBMVal(billstack.billGiver as Thing, bill);
             SoundDefOf.Click.PlayOneShotOnCamera();
         }
     }
 }
예제 #23
0
        public static void Postfix(Bill_Production __instance, ctx __state, ref BillStack ___billStack)
        {
            if (__state.repeatCount != __instance.repeatCount)
            {
                int b = __instance.repeatCount;
                __instance.repeatCount = __state.repeatCount;
                BillRepeatModeUtilityPatch.SetBillRepeatCount(__instance, b);
            }

            if (__state.targetCount != __instance.targetCount)
            {
                int b = __instance.targetCount;
                __instance.targetCount = __state.targetCount;
                BillRepeatModeUtilityPatch.SetBillTargetCount(__instance, b);
            }
        }
예제 #24
0
        private static Bill DoBillListingSMU(BillStack billStack, Rect rect, Func <List <FloatMenuOption> > recipeOptionsMakerStandard, Func <List <FloatMenuOption> > recipeOptionsMakerAdvanced, ref Vector2 scrollPosition, ref float viewHeight)
        {
            Bill result = null;

            GUI.BeginGroup(rect);
            Text.Font = GameFont.Small;
            if (billStack.Count < 15)
            {
                Rect rect2 = new Rect(0f, 0f, 160f, 29f);
                if (Widgets.ButtonText(rect2, "AddStandardSurgery".Translate(), true, false, true))
                {
                    Find.WindowStack.Add(new FloatMenu(recipeOptionsMakerStandard()));
                }
                Rect rect3 = new Rect(170f, 0f, 160f, 29f);
                if (Widgets.ButtonText(rect3, "AddAdvancedSurgery".Translate(), true, false, true))
                {
                    Find.WindowStack.Add(new FloatMenu(recipeOptionsMakerAdvanced()));
                }
            }
            Text.Anchor = TextAnchor.UpperLeft;
            GUI.color   = Color.white;
            Rect outRect  = new Rect(0f, 35f, rect.width, rect.height - 35f);
            Rect viewRect = new Rect(0f, 0f, outRect.width - 16f, viewHeight);

            Widgets.BeginScrollView(outRect, ref scrollPosition, viewRect);
            float num = 0f;

            List <Bill> bills = typeof(BillStack).GetField("bills", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(billStack) as List <Bill>;

            for (int i = 0; i < billStack.Count; i++)
            {
                Bill bill  = bills[i];
                Rect rect3 = bill.DoInterface(0f, num, viewRect.width, i);
                if (!bill.DeletedOrDereferenced && Mouse.IsOver(rect3))
                {
                    result = bill;
                }
                num += rect3.height + 6f;
            }
            if (Event.current.type == EventType.Layout)
            {
                viewHeight = num + 60f;
            }
            Widgets.EndScrollView();
            GUI.EndGroup();
            return(result);
        }
예제 #25
0
        public static bool BillStack_AddBill_Prefix(BillStack __instance, Bill bill)
        {
            var customizableBill = bill as Bill_Customizer;

            if (customizableBill != null)
            {
                var worker = customizableBill.Worker;
                worker.billStack = __instance;

                if (!worker.OnAddBill())
                {
                    return(false);
                }
            }

            return(true);
        }
        static void ReorderBillInStack(BillStack stack, int from, int to)
        {
            if (to >= stack.Count)
            {
                to = stack.Count - 1;
            }

            if (from == to)
            {
                return;
            }

            var bill   = stack[from];
            var offset = to - from;

            stack.Reorder(bill, offset);
        }
예제 #27
0
        }         //end UpdateDesiredRequests

        /// <summary>
        /// Updates the _activeBill variable from the billID. Should only need to be called when loading a save.
        /// </summary>
        public void UpdateActiveBill()
        {
            BillStack bills = (observedThingHolder as IBillGiver)?.BillStack;

            if (bills == null)
            {
                return;
            }

            foreach (Bill_Production curBill in bills)
            {
                if (curBill.GetUniqueLoadID() == _activeBillID)
                {
                    _activeBill = curBill;
                }
            }
        }
예제 #28
0
        public static void CheckBillBMValues(CompBestMix CBM, Thing billGiver, List <string> BillModes)
        {
            if (BillModes != null)
            {
                if (BillModes.Count > 0)
                {
                    List <string> newBillModes = new List <string>();
                    List <string> billIDs      = new List <string>();
                    BillStack     billStack    = (billGiver as IBillGiver)?.BillStack;
                    if (billStack != null)
                    {
                        List <Bill> bills = billStack?.Bills;
                        if (bills.Count > 0)
                        {
                            foreach (Bill bill in bills)
                            {
                                string id = bill?.GetUniqueLoadID();
                                if (id != null)
                                {
                                    billIDs.AddDistinct <string>(id);
                                }
                            }
                        }
                    }

                    foreach (string BillMode in BillModes)
                    {
                        if ((billIDs.Contains(BillValuePart(BillMode))))
                        {
                            newBillModes.AddDistinct <string>(BillMode);
                        }
                    }

                    CBM.BillBMModes = newBillModes;
                    //newBillModes.Clear();
                    //billIDs.Clear();
                }
            }
            else
            {
                CBM.BillBMModes = new List <string>();
            }
        }
예제 #29
0
        public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
        {
            string    recipeDefName = info.GetString("recipedef");
            BillStack st            = (BillStack)info.GetValue("bill_stack", typeof(BillStack));

            RimLog.Message("bill lacks pawn restriction in surrogate!");
            RimLog.Message("billstack is null ? " + (st == null ? "yes" : "no"));
            RimLog.Message("bill giver as thing : " + (st.billGiver as Thing));
            RimLog.Message("bill giver def as thing : " + (st.billGiver as Thing).def);

            foreach (var rec in (st.billGiver as Thing).def.recipes)
            {
                if (rec.defName == recipeDefName)
                {
                    return(BillUtility.MakeNewBill(rec));
                }
            }

            RimLog.Message("could not make bill!");
            return(null);
        }
예제 #30
0
        public void SaveBill(Bill originalBill)
        {
            if (IsTracked(originalBill))
            {
                return;
            }

            Bill duplicateBill = originalBill.Clone();

            duplicateBill.InitializeAfterClone();

            BillStack billStack = new BillStack(originalBill.billStack.billGiver);

            billStack.AddBill(duplicateBill);

            MeeseeksBillKnowledge newBillKnowledge = new MeeseeksBillKnowledge();

            newBillKnowledge.originalBill = originalBill;
            newBillKnowledge.billStack    = billStack;
            newBillKnowledge.billGiver    = billStack.billGiver as Thing;

            bills.Add(newBillKnowledge);
        }