コード例 #1
0
ファイル: ConsignmentHelper.cs プロジェクト: yakoder/NRaas
        protected static void Consign(Dictionary <ulong, List <ConsignedObjectProxy> > lookup, Dictionary <ObjectGuid, float> consignAttempts, float[] consignmentPrices, float madeGoodSaleThreshold, float reputationBonusForPositiveFeedback, Curve qualityVsReputationCurve, float sellXItemsOpportunityReputationGainMultiplier, int consignmentLifespan, float dailyNumberOfAttemptsDecrement, Curve reputationVsStoreFeeCurve, int numberOfTopSellingItems, float makeXSimoleonsOpportunityConsignmentFeeMultiplier)
        {
            if (lookup != null)
            {
                Dictionary <ulong, SimDescription> sims = SimListing.GetSims <SimDescription>(null, false);

                foreach (ulong num in lookup.Keys)
                {
                    SimDescription desc = null;
                    sims.TryGetValue(num, out desc);
                    if ((desc != null) && (desc.CreatedSim != null))// && desc.CreatedSim.IsInActiveHousehold)
                    {
                        Consignment consignment = desc.SkillManager.AddElement(SkillNames.Consignment) as Consignment;

                        bool unsold = false;

                        int totalSale = 0x0;

                        List <Pair <int, IGameObject> > list = new List <Pair <int, IGameObject> >();

                        bool bornSalesmanAdded = false;

                        string displayName = null;

                        List <ConsignedObjectProxy> list2 = lookup[num];

                        int index = 0x0;
                        while (index < list2.Count)
                        {
                            ConsignedObjectProxy local1 = list2[index];
                            local1.Age++;

                            float chance = 0;

                            try
                            {
                                if (list2[index].Object != null)
                                {
                                    chance = list2[index].GetChanceOfSale(desc.CreatedSim);
                                }
                                else
                                {
                                    list2.RemoveAt(index);
                                    continue;
                                }
                            }
                            catch (Exception e)
                            {
                                Common.DebugException("Consignment Section A", e);
                                chance = 1f;
                            }

                            if (RandomUtil.RandomChance01(chance))
                            {
                                if (list2[index].Age >= consignmentPrices.Length)
                                {
                                    list2[index].Age = consignmentPrices.Length - 1;
                                }

                                int valueOfSale = list2[index].GetValueOfSale(desc);
                                totalSale += valueOfSale;

                                float quality = list2[index].GetQuality();

                                try
                                {
                                    if ((((float)valueOfSale) / ((float)list2[index].Object.Value)) >= madeGoodSaleThreshold)
                                    {
                                        desc.CreatedSim.BuffManager.AddElement(BuffNames.MadeGoodSale, Origin.None);
                                    }

                                    if (!bornSalesmanAdded && (((desc.TraitManager.HasElement(TraitNames.BornSalesman) && (quality >= TraitTuning.BornSalesmanQualityMinimumThresholdForPositiveFeedback)) && RandomUtil.InterpolatedChance(TraitTuning.BornSalesmanQualityMinimumThresholdForPositiveFeedback, 1f, TraitTuning.BornSalesmanQualityMinimumChanceOfPositiveFeedback, TraitTuning.BornSalesmanQualityMaximumChanceOfPositiveFeedback, quality)) || ((!desc.TraitManager.HasElement(TraitNames.BornSalesman) && (quality >= ConsignmentRegister.kQualityMinimumThreshold)) && RandomUtil.InterpolatedChance(ConsignmentRegister.kQualityMinimumThreshold, 1f, ConsignmentRegister.kQualityMinimumChanceOfPositiveFeedback, ConsignmentRegister.kQualityMaximumChanceOfPositiveFeedback, quality))))
                                    {
                                        bornSalesmanAdded = true;
                                        displayName       = list2[index].DisplayName;
                                        consignment.TrackReputationChange(reputationBonusForPositiveFeedback);
                                    }

                                    float reputationChange = qualityVsReputationCurve.Fx(quality);
                                    if (consignment.OppItemsSoldLifetimeOpportunityCompleted && (reputationChange > 0f))
                                    {
                                        reputationChange *= sellXItemsOpportunityReputationGainMultiplier;
                                    }

                                    if (desc.TraitManager.HasElement(TraitNames.BornSalesman) && (reputationChange > 0f))
                                    {
                                        reputationChange *= TraitTuning.BornSalesmanReputationOnSaleBonusMultiplier;
                                    }

                                    consignment.TrackConsignmentSale(list2[index].Object, valueOfSale, reputationChange);
                                }
                                catch (Exception e)
                                {
                                    Common.DebugException("Consignment Section B", e);
                                }

                                list.Add(new Pair <int, IGameObject>(valueOfSale, list2[index].Object));

                                EventTracker.SendEvent(EventTypeId.kSoldConsignedObject, desc.CreatedSim);

                                GameObject obj2 = list2[index].Object as GameObject;
                                if (obj2 != null)
                                {
                                    Consignments.NotifySell(desc, obj2, valueOfSale);
                                }
                                list2.RemoveAt(index);
                            }
                            else if (list2[index].Age >= consignmentLifespan)
                            {
                                unsold = true;
                                consignment.TrackConsignmentReturn();

                                if (desc.CreatedSim.Inventory.ValidForThisInventory(list2[index].Object))
                                {
                                    Inventories.TryToMove(list2[index].Object, desc.CreatedSim);
                                }
                                else
                                {
                                    desc.CreatedSim.Household.SharedFamilyInventory.Inventory.TryToAdd(list2[index].Object);
                                }

                                list2[index].Object.EnableInteractions();
                                list2.RemoveAt(index);
                            }
                            else
                            {
                                index++;
                            }
                        }

                        DisplayStory(desc, list, totalSale, unsold, displayName, reputationVsStoreFeeCurve, numberOfTopSellingItems, makeXSimoleonsOpportunityConsignmentFeeMultiplier);
                    }
                }
            }

            foreach (ObjectGuid guid in new List <ObjectGuid>(consignAttempts.Keys))
            {
                float attempts = consignAttempts[guid];

                consignAttempts[guid] = Math.Max((float)0f, (float)(attempts - dailyNumberOfAttemptsDecrement));
            }
        }