Пример #1
0
 public override bool Test(Sim a, InventionWorkbench target, bool isAutonomous, ref GreyedOutTooltipCallback greyedOutTooltipCallback)
 {
     if (target.InUse || target.mIsMakingFrankensim)
     {
         return(false);
     }
     if (target.mInventionProgress > 0)
     {
         if (!a.SkillManager.GetSkill <InventingSkill>(SkillNames.Inventing).KnownInventions.Contains(target.mInventionKey))
         {
             return(false);
         }
     }
     return(true);
 }
Пример #2
0
        public override bool Run()
        {
            try
            {
                if (Target == null)
                {
                    return(false);
                }

                if (!Target.RouteToWorkbench(Actor))
                {
                    return(false);
                }

                mInventSkill = Actor.SkillManager.AddElement(SkillNames.Inventing) as InventingSkill;

                bool flag = Target.mInventionProgress > 0f;

                Definition interactionDefinition = InteractionDefinition as Definition;

                mMakeMany = true;
                if (flag)
                {
                    string mInventionKey = Target.mInventionKey;

                    if (!InventingSkill.kInventionDataMap.TryGetValue(mInventionKey, out mCurData))
                    {
                        return(false);
                    }
                    if (Target.mDummyModel == null)
                    {
                        Target.ScrapCurrentInvention();
                        return(false);
                    }
                }
                else
                {
                    if (Target.mDummyModel != null)
                    {
                        Target.CleanupDummyModel();
                    }

                    List <string> choices = new List <string>(mInventSkill.KnownInventions);

                    bool success = false;
                    while (choices.Count > 0)
                    {
                        string choice = RandomUtil.GetRandomObjectFromList(choices);
                        choices.Remove(choice);

                        if (InventingSkill.kInventionDataMap.TryGetValue(choice, out mCurData))
                        {
                            if (mCurData.InventType == InventionType.Toy)
                            {
                                mIsCheapToy = RandomUtil.CoinFlip();
                            }

                            if (!Target.ReserveScrap(mCurData.GetScrapCost(Actor, mIsCheapToy), Actor, mScrapList))
                            {
                                if (mIsCheapToy)
                                {
                                    continue;
                                }

                                mIsCheapToy = true;
                                if (!Target.ReserveScrap(mCurData.GetScrapCost(Actor, mIsCheapToy), Actor, mScrapList))
                                {
                                    continue;
                                }
                            }

                            success = true;
                            break;
                        }
                    }

                    if (!success)
                    {
                        return(false);
                    }

                    Target.mInventionKey      = mCurData.MedatorName;
                    Target.mInventionProgress = 0f;
                    Target.mIsMakingCheapToy  = mIsCheapToy;
                    if (!Target.ConsumeScrap(mScrapList))
                    {
                        ShowOutOfScrapTNS();
                        return(false);
                    }
                }
                if (Target.mWasFinishedByGnome)
                {
                    ShowGnomeFinishedInventionTNS();
                }
                StandardEntry();
                StartStages();
                mTimeUntilModelSwap = GetTimeForNextModelChange();
                EnterStateMachine("WorkbenchInvention", "Enter", "x", "workstation");
                if (Actor.SimDescription.Child)
                {
                    mStool = GlobalFunctions.CreateObjectOutOfWorld("ChildStool") as GameObject;
                    SetActor("stool", mStool);
                }
                SetParameter("shouldSwipe", !flag);
                SetParameter("skillLevel", InventionWorkbench.GetSkillLevelParam(mInventSkill));
                if (!flag)
                {
                    AddSynchronousOneShotScriptEventHandler(0x67, new SacsEventHandler(OnAnimationEvent));
                }
                mTotalTime = GetTimeToCompletion();
                AnimateSim("Loop Invent");
                BeginCommodityUpdates();

                bool succeeded = false;
                try
                {
                    if (Actor.SimDescription.TeenOrAbove)
                    {
                        Actor.SkillManager.StartGainWithoutSkillMeter(SkillNames.Handiness, InventionWorkbench.kHandinessSkillGainRateDuringMake, true);
                    }

                    succeeded = DoLoop(~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached), new Interaction <Sim, InventionWorkbench> .InsideLoopFunction(MakeLoopCallback), mCurrentStateMachine);
                }
                finally
                {
                    if (Actor.SimDescription.TeenOrAbove)
                    {
                        Actor.SkillManager.StopSkillGain(SkillNames.Handiness);
                    }

                    EndCommodityUpdates(succeeded);
                }

                if ((Target.mInventionProgress == 0f) && (Target.mDummyModel != null))
                {
                    Target.mDummyModel.FadeOut(false, true);
                    Target.mDummyModel = null;
                }

                AnimateSim("Exit");
                StandardExit();
                return(succeeded);
            }
            catch (ResetException)
            {
                throw;
            }
            catch (Exception e)
            {
                Common.Exception(Actor, Target, e);
                return(false);
            }
        }
Пример #3
0
        public new void MakeLoopCallback(StateMachineClient smc, Interaction <Sim, InventionWorkbench> .LoopData ld)
        {
            try
            {
                Target.mInventionProgress += ld.mDeltaTime / mTotalTime;
                if (Target.mInventionProgress >= 1f)
                {
                    AddSynchronousOneShotScriptEventHandler(0x65, new SacsEventHandler(OnAnimationEvent));
                    AnimateSim("Swipe");
                    if (mMakeMany)
                    {
                        if (!Target.ConsumeScrap(mCurData.GetScrapCost(Actor, mIsCheapToy), Actor))
                        {
                            ShowOutOfScrapTNS();
                            Actor.AddExitReason(ExitReason.Finished);
                        }
                        else
                        {
                            AddSynchronousOneShotScriptEventHandler(0x67, new SacsEventHandler(OnAnimationEvent));
                            SetParameter("skillLevel", InventionWorkbench.GetSkillLevelParam(mInventSkill));
                            AnimateSim("Loop Invent");
                            mFinalModelShown    = false;
                            mTimeUntilModelSwap = GetTimeForNextModelChange();
                        }
                    }
                    else
                    {
                        Actor.AddExitReason(ExitReason.Finished);
                    }
                }
                else if (!mFinalModelShown)
                {
                    if (Target.mInventionProgress >= InventionWorkbench.kShowFinalModelPercent)
                    {
                        string         miniModelName  = mCurData.MiniModelName;
                        ProductVersion prodVersion    = mCurData.ProdVersion;
                        Slot           finalModelSlot = mCurData.FinalModelSlot;

                        if (Target.mDummyModel == null)
                        {
                            Actor.AddExitReason(ExitReason.Finished);
                        }
                        else
                        {
                            Target.mDummyModel.UnParent();
                            Target.mDummyModel.ParentToSlot(Target, finalModelSlot);
                            Target.mDummyModel.SetModel(miniModelName, prodVersion);
                            mFinalModelShown = true;
                        }
                    }
                    else
                    {
                        mTimeUntilModelSwap -= ld.mDeltaTime;
                        if (mTimeUntilModelSwap <= 0f)
                        {
                            Target.SwapToRandomDummyGeoState(false);
                            mTimeUntilModelSwap = GetTimeForNextModelChange();
                        }
                    }
                }
            }
            catch (ResetException)
            {
                throw;
            }
            catch (Exception e)
            {
                Common.Exception(Actor, Target, e);
            }
        }
Пример #4
0
 public override bool Test(Sim a, InventionWorkbench target, bool isAutonomous, ref GreyedOutTooltipCallback greyedOutTooltipCallback)
 {
     if (target.InUse || target.mIsMakingFrankensim)
     {
         return false;
     }
     if (target.mInventionProgress > 0)
     {
         if (!a.SkillManager.GetSkill<InventingSkill>(SkillNames.Inventing).KnownInventions.Contains(target.mInventionKey))
         {
             return false;
         }
     }
     return true;
 }
Пример #5
0
        public override bool Run()
        {
            try
            {
                if (!Target.RouteToWorkbench(Actor))
                {
                    return(false);
                }

                mMakeFemale  = Target.mIsMakingFemaleFrankensim;
                mInventSkill = Actor.SkillManager.AddElement(SkillNames.Inventing) as InventingSkill;
                bool flag = Target.mInventionProgress > 0f;
                if (!flag)
                {
                    Definition interactionDefinition = InteractionDefinition as Definition;
                    mMakeFemale = interactionDefinition.MakeFemale;
                    Target.mIsMakingFemaleFrankensim = mMakeFemale;
                    ConsumeIngredients();
                }

                StandardEntry();
                Target.mIsMakingFrankensim      = true;
                Target.mFrankenSimInventorSimId = Actor.SimDescription.SimDescriptionId;
                StartStages();
                mTimeUntilModelSwap = GetTimeForNextModelChange();
                EnterStateMachine("WorkbenchInvention", "Enter", "x", "workstation");
                SetParameter("shouldSwipe", !flag);
                SetParameter("skillLevel", InventionWorkbench.GetSkillLevelParam(mInventSkill));
                if (!flag)
                {
                    AddSynchronousOneShotScriptEventHandler(0x67, OnAnimationEvent);
                }

                mTotalTime = GetTimeToCompletion();
                AnimateSim("Loop Invent");
                BeginCommodityUpdates();
                if (Actor.SimDescription.TeenOrAbove)
                {
                    Actor.SkillManager.StartGainWithoutSkillMeter(SkillNames.Handiness, InventionWorkbench.kHandinessSkillGainRateDuringMake, true);
                }

                bool succeeded = DoLoop(~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached), MakeLoopCallback, mCurrentStateMachine);
                if (Actor.SimDescription.TeenOrAbove)
                {
                    Actor.SkillManager.StopSkillGain(SkillNames.Handiness);
                }

                EndCommodityUpdates(succeeded);
                AnimateSim("Exit");
                if (!mRecipeKnown && !Actor.OpportunityManager.HasOpportunity(OpportunityNames.EP2_SkillInventing_Frankensim4))
                {
                    Target.ScrapCurrentInvention();
                }

                if (Target.mInventionProgress >= 1f)
                {
                    Sims3.Gameplay.Gameflow.SetGameSpeed(Sims3.Gameplay.Gameflow.GameSpeed.Normal, Sims3.Gameplay.Gameflow.SetGameSpeedContext.Gameplay);
                    RouteAwayFromTable();
                    Target.mDummyModel.UnParent();
                    Target.mDummyModel.Destroy();
                    Target.mDummyModel               = null;
                    Target.mInventionProgress        = 0f;
                    Target.mIsMakingFrankensim       = false;
                    Target.mFrankenSimInventorSimId  = 0x0L;
                    Target.mIsMakingFemaleFrankensim = false;
                    Target.mWasFinishedByGnome       = false;
                    Target.mIsMakingCheapToy         = false;
                    CASAgeGenderFlags gender = mMakeFemale ? CASAgeGenderFlags.Female : CASAgeGenderFlags.Male;
                    mFrankensim = OccultFrankenstein.CreateFrankenStein(Actor, gender);
                    mFrankensim.FadeOut(false, false, 0f);
                    mFrankensim.GreetSimOnLot(Target.LotCurrent);
                    mFrankensim.SetPosition(Target, Slot.RoutingSlot_1);
                    mFrankensim.SetForward((Vector3)(Slots.GetForwardOfSlot(Target.ObjectId, Slot.RoutingSlot_1) * -1f));
                    mFrankensim.AddToWorld();
                    InventingSkill skill = Actor.SkillManager.GetSkill <InventingSkill>(SkillNames.Inventing);
                    if (!skill.OppKnowFrankensimRecipeCompleted)
                    {
                        EventTracker.SendEvent(EventTypeId.kDiscoveredNewInvention, Actor, mFrankensim);
                    }
                    mCurrentStateMachine = StateMachineClient.Acquire(mFrankensim, "WorkbenchFrankensim", AnimationPriority.kAPDefault);
                    SetActor("workstation", Target);
                    SetActor("x", mFrankensim);
                    SetActor("y", Actor);
                    AddSynchronousOneShotScriptEventHandler(0x65, OnAnimationEvent);
                    EnterState("x", "Enter");
                    AnimateSim("Exit");
                    AdoptFrankenSim(Actor, mFrankensim);
                    skill.KnowsFrankensimRecipe = true;
                    skill.TestForNewLifetimeOpp();
                    EventTracker.SendEvent(EventTypeId.kFrankensimLearned, Actor);
                }

                StandardExit();
                return(succeeded);
            }
            catch (ResetException)
            {
                throw;
            }
            catch (Exception e)
            {
                Common.Exception(Actor, Target, e);
                return(false);
            }
        }
Пример #6
0
        protected override bool PrivateUpdate(ScenarioFrame frame)
        {
            base.PrivateUpdate(frame);

            InventingSkill skill = Sim.SkillManager.GetElement(SkillNames.Inventing) as InventingSkill;

            List <InventionWorkbench> benches = new List <InventionWorkbench>();
            List <InventionWorkbench> empties = new List <InventionWorkbench>();

            foreach (Lot lot in ManagerLot.GetOwnedLots(Sim))
            {
                foreach (InventionWorkbench bench in lot.GetObjects <InventionWorkbench>())
                {
                    if (bench.InUse)
                    {
                        continue;
                    }

                    if (bench.mIsMakingFrankensim)
                    {
                        continue;
                    }

                    if (bench.mInventionProgress > 0)
                    {
                        if (skill == null)
                        {
                            continue;
                        }

                        if (!skill.KnownInventions.Contains(bench.mInventionKey))
                        {
                            continue;
                        }

                        benches.Add(bench);
                    }
                    else
                    {
                        empties.Add(bench);
                    }
                }
            }

            if (benches.Count == 0)
            {
                benches.AddRange(empties);

                if (benches.Count == 0)
                {
                    IncStat("No Bench");
                    return(false);
                }
            }

            int minimumScrap   = InventionWorkbench.kNumScrapsPerDiceRoll * 10;
            int inventoryScrap = Inventories.InventoryFindAll <Scrap>(Sim).Count;

            if (inventoryScrap < minimumScrap)
            {
                List <JunkPile> piles = new List <JunkPile>();
                foreach (JunkPile pile in Sims3.Gameplay.Queries.GetObjects <JunkPile>())
                {
                    if (pile.IsEmpty)
                    {
                        continue;
                    }

                    if (pile.LotCurrent == Sim.LotHome)
                    {
                        piles.Add(pile);
                    }
                    else if (pile.LotCurrent == null)
                    {
                        continue;
                    }
                    else if (pile.LotCurrent.IsCommunityLot)
                    {
                        piles.Add(pile);
                    }
                }

                bool success = false;

                while (piles.Count > 0)
                {
                    JunkPile junkChoice = RandomUtil.GetRandomObjectFromList(piles);
                    piles.Remove(junkChoice);

                    if (!Situations.PushInteraction(this, Sim, junkChoice, DigThroughEx.Singleton))
                    {
                        break;
                    }

                    IncStat("Push Dig Through");

                    success = true;
                }

                if (!success)
                {
                    Money.AdjustFunds(Sim, "BuyItem", -InventionWorkbench.Restock.GetScrapCost(minimumScrap - inventoryScrap));

                    AddStat("Buy Scrap", minimumScrap - inventoryScrap);

                    CreateScrap(Sim.CreatedSim, minimumScrap - inventoryScrap);
                }
                else
                {
                    return(true);
                }
            }

            InventionWorkbench choice = RandomUtil.GetRandomObjectFromList(benches);

            if (choice.mInventionProgress > 0)
            {
                IncStat("Try Continue");

                if (Situations.PushInteraction(this, Sim, choice, MakeInventionEx.Singleton))
                {
                    return(true);
                }

                IncStat("Continue Fail");
                return(false);
            }
            else
            {
                if ((skill != null) && (skill.GetUndiscoveredInventions().Count == 0x0) && (skill.ReachedMaxLevel()))
                {
                    IncStat("Try Start New");

                    if (Situations.PushInteraction(this, Sim, choice, MakeInventionEx.Singleton))
                    {
                        return(true);
                    }

                    IncStat("Start New Fail");
                    return(false);
                }
                else
                {
                    if ((skill == null) || (skill.KnownInventions.Count == 0) || (RandomUtil.RandomChance(25)))
                    {
                        IncStat("Try Invent");

                        if (Situations.PushInteraction(this, Sim, choice, new InventionWorkbench.Invent.Definition()))
                        {
                            return(true);
                        }

                        IncStat("Invent Fail");
                        return(false);
                    }
                    else
                    {
                        IncStat("Try Start New");

                        if (Situations.PushInteraction(this, Sim, choice, MakeInventionEx.Singleton))
                        {
                            return(true);
                        }

                        IncStat("Start New Fail");
                        return(false);
                    }
                }
            }
        }