Ejemplo n.º 1
0
        protected override bool PrivateUpdate(ScenarioFrame frame)
        {
            if (Sim.CreatedSim == null)
            {
                Sims.Instantiate(Sim, Sim.LotHome, false);
            }

            if (Target.CreatedSim == null)
            {
                Sims.Instantiate(Target, Target.LotHome, false);
            }

            if ((Sim.CreatedSim == null) || (Target.CreatedSim == null))
            {
                IncStat("Uninstantiated");
                return(false);
            }
            else
            {
                if (Sim.IsRobot)
                {
                    if ((Sim.LotHome == null) ||
                        ((Sim.LotHome.CountObjects <BotMakingStation> () + Sim.LotHome.CountObjects <InventionWorkbench>()) == 0))
                    {
                        IncStat("No Workbench");
                        return(false);
                    }

                    SimDescription child = null;
                    if (Sim.IsFrankenstein)
                    {
                        bool reward = Sim.OccultManager.mIsLifetimeReward;

                        if ((Target.IsFrankenstein) && (RandomUtil.CoinFlip()))
                        {
                            reward = Target.OccultManager.mIsLifetimeReward;
                        }

                        Sim childSim = OccultFrankenstein.CreateFrankenStein(Sim.CreatedSim, CASAgeGenderFlags.None, reward);
                        if (childSim == null)
                        {
                            IncStat("Creation Fail");
                            return(false);
                        }

                        child = childSim.SimDescription;
                    }
                    else
                    {
                        child = OccultRobot.MakeRobot(CASAgeGenderFlags.Adult, CASAgeGenderFlags.None, RobotForms.MaxType);
                        if (child == null)
                        {
                            IncStat("Creation Fail");
                            return(false);
                        }

                        CASRobotData supernaturalData = child.SupernaturalData as CASRobotData;
                        if (supernaturalData != null)
                        {
                            supernaturalData.CreatorSim = Sim.SimDescriptionId;

                            int quality = 0;
                            int count   = 0;

                            CASRobotData parentData = Sim.SupernaturalData as CASRobotData;
                            if (parentData != null)
                            {
                                quality = parentData.BotQualityLevel;
                                count++;
                            }

                            parentData = Target.SupernaturalData as CASRobotData;
                            if (parentData != null)
                            {
                                quality += parentData.BotQualityLevel;
                                count++;
                            }

                            if (count == 2)
                            {
                                quality /= count;
                            }

                            supernaturalData.BotQualityLevel = quality;
                        }
                    }

                    if (child.Genealogy.Parents.Count == 0)
                    {
                        Sim.Genealogy.AddChild(child.Genealogy);
                    }

                    Target.Genealogy.AddChild(child.Genealogy);

                    if (!Households.MoveSim(child, Sim.Household))
                    {
                        IncStat("Move Fail");

                        Deaths.CleansingKill(child, true);

                        return(false);
                    }

                    return(true);
                }
                else if (Target.IsRobot)
                {
                    IncStat("Simbot Partner");
                    return(false);
                }
                else
                {
                    if (CommonSpace.Helpers.Pregnancies.Start(Sim.CreatedSim, Target, false) != null)
                    {
                        ManagerSim.ForceRecount();

                        if (Sim.IsHuman)
                        {
                            if (OnGatheringScenario != null)
                            {
                                OnGatheringScenario(this, frame);
                            }
                        }

                        if ((!Sim.IsHuman) && (Sim.Partner != Target))
                        {
                            if ((GetValue <AllowMarriageOption, bool>(Sim)) && (GetValue <AllowMarriageOption, bool>(Target)))
                            {
                                if ((Romances.AllowBreakup(this, Sim, Managers.Manager.AllowCheck.None)) && (Romances.AllowBreakup(this, Target, Managers.Manager.AllowCheck.None)))
                                {
                                    RemoveAllPetMateFlags(Sim);
                                    RemoveAllPetMateFlags(Target);
                                    Relationship.Get(Sim, Target, false).LTR.AddInteractionBit(LongTermRelationship.InteractionBits.Marry);
                                }
                            }
                        }
                    }
                    return(true);
                }
            }
        }
Ejemplo n.º 2
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);
            }
        }