예제 #1
0
            public override bool Test(Sim a, Sim target, bool isAutonomous, ref GreyedOutTooltipCallback greyedOutTooltipCallback)
            {
                try
                {
                    InteractionInstance currentInteraction = a.CurrentInteraction;
                    if (((currentInteraction != null) && (currentInteraction.Target == target)) && ((currentInteraction is CuddleSeated) || (currentInteraction is NestedCuddleInteraction)))
                    {
                        return(false);
                    }

                    IHasSeatingGroup container = a.Posture.Container as IHasSeatingGroup;
                    if (container != null)
                    {
                        Seat seat = container.SeatingGroup[a];
                        if ((seat != null) && (seat is IHotTubSeat))
                        {
                            if (target.CurrentOutfitCategory == OutfitCategories.SkinnyDippingTowel)
                            {
                                greyedOutTooltipCallback = new GrayedOutTooltipHelper(target.IsFemale, "ClothesStolenTooltip", null).GetTooltip;
                                return(false);
                            }
                        }
                    }

                    string reason;
                    if (!CommonSocials.CanGetRomantic(a, target, isAutonomous, false, true, ref greyedOutTooltipCallback, out reason))
                    {
                        return(false);
                    }

                    if (!StartSeatedCuddleA.Definition.CanCuddle(a, target, ref greyedOutTooltipCallback, true))
                    {
                        return(false);
                    }

                    return(true);
                }
                catch (Exception exception)
                {
                    Common.Exception(a, target, exception);
                    return(false);
                }
            }
예제 #2
0
        public override bool Run()
        {
            try
            {
                if (!StartSync())
                {
                    return(false);
                }

                StandardEntry(false);
                BeginCommodityUpdates();
                if (IsMaster)
                {
                    ReturnInstance.EnsureMaster();
                    StartSocial("Make Out");
                    InitiateSocialUI(Actor, Target);
                    (LinkedInteractionInstance as NestedCuddleInteraction).Rejected = Rejected;

                    //Custom
                    mReactToSocialBroadcaster = new ReactionBroadcaster(Actor, Conversation.ReactToSocialParams, SocialComponentEx.ReactToJealousEventHigh);
                    //SocialComponent.SendCheatingEvents(Actor, Target, !Rejected);

                    IHasSeatingGroup container = Actor.Posture.Container as IHasSeatingGroup;
                    Seat             seat      = container.SeatingGroup[Actor];
                    ReturnInstance.mCurrentStateMachine.SetParameter("IsHottub", seat is IHotTubSeat);
                    if (Rejected)
                    {
                        ReturnInstance.mCurrentStateMachine.RequestState(null, "MakeOutReject");
                        ReturnInstance.mCurrentStateMachine.RequestState(null, "ExitSitting");
                        FinishSocial("Make Out", true);
                        FinishSocialContext();
                    }
                    else
                    {
                        ReturnInstance.mCurrentStateMachine.RequestState(null, "MakeOut");
                        StartStages();
                        DoLoop(~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached));
                        FinishSocial("Make Out", true);
                    }
                }
                else
                {
                    DoLoop(~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached));
                }

                FinishLinkedInteraction(IsMaster);
                EndCommodityUpdates(!Rejected);
                StandardExit(false, false);
                EventTracker.SendEvent(new SocialEvent(EventTypeId.kSocialInteraction, Actor, Target, "Make Out", !IsMaster, !Rejected, false, CommodityTypes.Undefined));
                EventTracker.SendEvent(EventTypeId.kMadeOut, Actor, Target);
                if (Rejected)
                {
                    InvokeDoResumeOnCleanup = false;
                }
                else
                {
                    Actor.SimDescription.SetFirstKiss(Target.SimDescription);
                }

                WaitForSyncComplete();
                return(!Rejected);
            }
            catch (ResetException)
            {
                throw;
            }
            catch (Exception e)
            {
                Common.Exception(Actor, Target, e);
                return(false);
            }
        }
예제 #3
0
        public override bool Run()
        {
            try
            {
                Actor.GreetSimOnMyLotIfPossible(Target);
                Seat.EnsureLivingChairPosture(Actor);
                IHasSeatingGroup container = Actor.Posture.Container as IHasSeatingGroup;
                Seat             otherSeat = container.SeatingGroup[Actor];
                Seat             seat2     = container.SeatingGroup[Target];
                if (!SafeToSync())
                {
                    return(false);
                }

                Actor.LookAtManager.SetInteractionLookAt(Target, kTargetLookAtPriority, LookAtJointFilter.TorsoBones);
                if ((seat2 != null) && !seat2.IsAdjacentTo(otherSeat))
                {
                    Seat emptyAdjacentSeat = seat2.GetEmptyAdjacentSeat(Actor);
                    if (emptyAdjacentSeat != null)
                    {
                        InteractionInstance instance            = otherSeat.CreateChangeSeatInteraction(emptyAdjacentSeat, GetPriority(), Autonomous, CancellableByPlayer);
                        SaunaClassic.StartSaunaSeatedCuddleA ea = Singleton.CreateInstance(Target, Actor, GetPriority(), Autonomous, CancellableByPlayer) as SaunaClassic.StartSaunaSeatedCuddleA;
                        Actor.InteractionQueue.PushAsContinuation(instance, true);
                        Actor.InteractionQueue.PushAsContinuation(ea, true);
                        return(true);
                    }
                    return(false);
                }

                SaunaClassic.StartSaunaSeatedCuddleB entry = SaunaClassic.StartSaunaSeatedCuddleB.Singleton.CreateInstance(Actor, Target, GetPriority(), false, CancellableByPlayer) as SaunaClassic.StartSaunaSeatedCuddleB;
                entry.SeatX = otherSeat;
                entry.SeatY = seat2;
                LinkedInteractionInstance = entry;
                Target.InteractionQueue.Add(entry);

                // Custom
                mReactToSocialBroadcaster = new ReactionBroadcaster(Actor, Conversation.ReactToSocialParams, SocialComponentEx.ReactToJealousEventMedium);
                //SocialComponent.SendCheatingEvents(Actor, Target, !Rejected);

                Actor.SynchronizationRole   = Sim.SyncRole.Initiator;
                Actor.SynchronizationLevel  = Sim.SyncLevel.Started;
                Actor.SynchronizationTarget = Target;
                Target.SynchronizationLevel = Sim.SyncLevel.NotStarted;
                if (!Actor.WaitForSynchronizationLevelWithSim(Target, Sim.SyncLevel.Started, (float)kHowLongToWaitForOtherToArrive))
                {
                    return(false);
                }

                StartSocial("Cuddle");
                entry.Reject = Rejected;
                if (!Actor.WaitForSynchronizationLevelWithSim(Target, Sim.SyncLevel.Routed, (float)kHowLongToWaitForOtherToArrive))
                {
                    return(false);
                }

                if (Rejected)
                {
                    if (Seat.SimsAreAdjacent(Actor, Target))
                    {
                        Seat.EnsureLivingChairPosture(Target);
                        bool paramValue = seat2 == otherSeat.Right;
                        EnterStateMachine("SeatingCuddle", "EnterSitting", "x", "y");
                        mCurrentStateMachine.EnterState("y", "EnterSitting");
                        mCurrentStateMachine.EnterState("SeatX", "EnterSitting");
                        mCurrentStateMachine.EnterState("SeatY", "EnterSitting");
                        SetActor("SeatX", otherSeat.Host);
                        SetParameter("SuffixX", otherSeat.IKSuffix);
                        SetActor("SeatY", seat2.Host);
                        SetParameter("SuffixY", seat2.IKSuffix);
                        SetActor("surface", otherSeat.Host);
                        SetParameter("IsMirrored", paramValue);
                        bool flag2 = otherSeat is IHotTubSeat;
                        SetParameter("IsHottub", flag2);
                        mCurrentStateMachine.RequestState(false, "x", "CuddleReject");
                        mCurrentStateMachine.RequestState(false, "SeatX", "CuddleReject");
                        mCurrentStateMachine.RequestState(false, "SeatY", "CuddleReject");
                        mCurrentStateMachine.RequestState(true, "y", "CuddleReject");
                        mCurrentStateMachine.RequestState(null, "ExitSitting");
                        Target.RouteAway(kMinDistanceToMoveAwayWhenRejected, kMaxDistanceToMoveAwayWhenRejected, true, new InteractionPriority(InteractionPriorityLevel.Zero), false, true, true, RouteDistancePreference.NoPreference);
                    }
                    else if (Actor.TraitManager.HasElement(TraitNames.HotHeaded))
                    {
                        Actor.PlayReaction(ReactionTypes.JealousIntense, ReactionSpeed.Immediate);
                    }
                    else if (Actor.TraitManager.HasElement(TraitNames.OverEmotional))
                    {
                        Actor.PlayReaction(ReactionTypes.JealousMild, ReactionSpeed.Immediate);
                    }
                    else if (Actor.TraitManager.HasAnyElement(new TraitNames[] { TraitNames.Flirty, TraitNames.GreatKisser }))
                    {
                        Actor.PlayReaction(ReactionTypes.Shrug, ReactionSpeed.Immediate);
                    }
                    else
                    {
                        Actor.PlayReaction(ReactionTypes.Awkward, ReactionSpeed.Immediate);
                    }
                    return(false);
                }

                Actor.SynchronizationLevel = Sim.SyncLevel.Completed;
                if (!Actor.WaitForSynchronizationLevelWithSim(Target, Sim.SyncLevel.Completed, (float)kHowLongToWaitForOtherToArrive))
                {
                    return(false);
                }

                if (!Seat.SimsAreAdjacent(Actor, Target))
                {
                    Actor.Posture.CurrentStateMachine.RequestState("x", "routeFail");
                    return(false);
                }

                if (seat2 == null)
                {
                    seat2 = container.SeatingGroup[Target];
                }

                InteractionPriority priority = new InteractionPriority(InteractionPriorityLevel.Zero);
                CuddleSeated        seated   = CuddleSeated.Singleton.CreateInstance(Target, Actor, priority, false, CancellableByPlayer) as CuddleSeated;
                seated.AdoptSocialEffect(this);
                seated.SeatX = otherSeat;
                seated.SeatY = seat2;
                CuddleSeated seated2 = CuddleSeated.Singleton.CreateInstance(Actor, Target, priority, false, CancellableByPlayer) as CuddleSeated;
                seated2.SeatX = otherSeat;
                seated2.SeatY = seat2;
                seated.LinkedInteractionInstance = seated2;
                EventTracker.SendEvent(new SocialEvent(EventTypeId.kSocialInteraction, Actor, Target, "Cuddle", false, !Rejected, false, CommodityTypes.Undefined));
                EventTracker.SendEvent(new SocialEvent(EventTypeId.kSocialInteraction, Target, Actor, "Cuddle", true, !Rejected, false, CommodityTypes.Undefined));
                EventTracker.SendEvent(EventTypeId.kCuddled, Actor, Target);
                EventTracker.SendEvent(EventTypeId.kCuddled, Target, Actor);
                Actor.InteractionQueue.Add(seated);
                Target.InteractionQueue.Add(seated2);
                return(!Rejected);
            }
            catch (ResetException)
            {
                throw;
            }
            catch (Exception e)
            {
                Common.Exception(Actor, Target, e);
                return(false);
            }
        }
예제 #4
0
        public override bool Run()
        {
            try
            {
                ISaunaWooHooDefinition definition = InteractionDefinition as ISaunaWooHooDefinition;

                if (!StartSync())
                {
                    DoResume();
                    return(false);
                }

                StandardEntry(false);
                mSauna = Actor.Posture.Container as SaunaClassic;
                if (Actor == mSauna.GetLeftSim())
                {
                    IHasSeatingGroup container = Actor.Posture.Container as IHasSeatingGroup;
                    Seat             seat      = container.SeatingGroup[Actor];
                    Seat             seat2     = container.SeatingGroup[Target];
                    if ((seat == null) || (seat2 == null))
                    {
                        Actor.AddExitReason(ExitReason.FailedToStart);
                        return(false);
                    }

                    // Custom
                    string socialName = CommonWoohoo.GetSocialName(definition.GetStyle(this), Actor);

                    ReturnInstance.EnsureMaster();
                    mCurrentStateMachine = ReturnInstance.mCurrentStateMachine;
                    StartSocial(socialName);
                    InitiateSocialUI(Actor, Target);
                    SaunaClassic.CuddleSeatedWooHooSauna linkedInteractionInstance = LinkedInteractionInstance as SaunaClassic.CuddleSeatedWooHooSauna;
                    linkedInteractionInstance.Rejected = Rejected;
                    if (Rejected)
                    {
                        mCurrentStateMachine.RequestState(null, "Woo Hoo Reject");
                        mCurrentStateMachine.RequestState(null, "ExitSitting");
                        FinishSocial(socialName, true);
                        FinishSocialContext();
                        Actor.BuffManager.AddElement(BuffNames.WalkOfShame, Origin.FromRejectedWooHooOffHome);
                    }
                    else
                    {
                        mCurrentStateMachine.RequestState(null, "ExitSitting");

                        // Custom
                        CommonWoohoo.TestNakedOutfit(Woohooer.Settings.mNakedOutfitSaunaWoohoo, Actor, Target);

                        if (Stand.Singleton.CreateInstance(mSauna, Actor, Actor.InheritedPriority(), false, false).RunInteraction())
                        {
                            // Custom
                            if (CommonWoohoo.NeedPrivacy(false, Actor, Target))
                            {
                                mSituation     = new WooHoo.WooHooPrivacySituation(this);
                                mPrivacyFailed = !mSituation.Start();
                            }
                            else
                            {
                                mPrivacyFailed = false;
                            }

                            linkedInteractionInstance.mPrivacyFailed = mPrivacyFailed;
                            if (!mPrivacyFailed && Actor.RouteToSlot(mSauna, Slot.RoutingSlot_14))
                            {
                                EnterStateMachine("Sauna_store", "SimEnter", "x");
                                SetActor("saunaX", seat.Host);
                                SetActor("saunaY", seat2.Host);
                                AddOneShotScriptEventHandler(0x384, OnAnimationEvent);
                                AnimateSim("PourWater");
                                AnimateSim("SimExit");

                                if (SaunaSit.WoohooSingleton.CreateInstance(mSauna, Actor, Actor.InheritedPriority(), false, false).RunInteraction())
                                {
                                    RockGemMetalBase.HandleNearbyWoohoo(Actor, RockGemMetalBase.HowMuchWooHoo.MoreWoohoo);
                                    EnterStateMachine("sauna_store", "SimEnter", "x", "y");
                                    SetActor("saunaX", mSauna);
                                    mCurrentStateMachine.AddOneShotScriptEventHandler(0x6e, OnAnimationEvent);
                                    mCurrentStateMachine.AddOneShotScriptEventHandler(0x6f, OnAnimationEvent);
                                    mCurrentStateMachine.AddOneShotScriptEventHandler(0x78, OnAnimationEvent);
                                    mCurrentStateMachine.AddOneShotScriptEventHandler(0x79, OnAnimationEvent);
                                    mCurrentStateMachine.AddOneShotScriptEventHandler(0x70, OnBabyCheckEventEx);

                                    SetActor("saunaX", seat.Host);
                                    SetActor("saunaY", seat2.Host);
                                    if (Actor == mSauna.GetLeftSim())
                                    {
                                        SetParameter("IsMirrored", true);
                                        SetParameter("SuffixX", mSauna.mSeatingGroup[Actor].IKSuffix);
                                        SetParameter("SuffixY", mSauna.mSeatingGroup[Target].IKSuffix);
                                    }
                                    else
                                    {
                                        SetParameter("IsMirrored", false);
                                        SetParameter("SuffixY", mSauna.mSeatingGroup[Actor].IKSuffix);
                                        SetParameter("SuffixX", mSauna.mSeatingGroup[Target].IKSuffix);
                                    }

                                    AnimateJoinSims("Woohoo");
                                    AnimateJoinSims("SimExit");
                                    RockGemMetalBase.HandleNearbyWoohoo(Actor, RockGemMetalBase.HowMuchWooHoo.LessWoohoo);

                                    // Custom
                                    CommonWoohoo.RunPostWoohoo(Actor, Target, mSauna, definition.GetStyle(this), definition.GetLocation(mSauna), true);

                                    Target.Motives.ChangeValue(CommodityKind.Fun, SaunaClassic.kWooHooFunBump);
                                    Target.Motives.ChangeValue(CommodityKind.Social, SaunaClassic.kWooHooSocialBump);
                                    Target.Motives.ChangeValue(CommodityKind.Hygiene, SaunaClassic.kWooHooHygieneBump);
                                    Actor.Motives.ChangeValue(CommodityKind.Fun, SaunaClassic.kWooHooFunBump);
                                    Actor.Motives.ChangeValue(CommodityKind.Social, SaunaClassic.kWooHooSocialBump);
                                    Actor.Motives.ChangeValue(CommodityKind.Hygiene, SaunaClassic.kWooHooHygieneBump);
                                }
                            }
                        }

                        FinishSocial(socialName, true);
                        Actor.AddExitReason(ExitReason.StageComplete);
                        Target.AddExitReason(ExitReason.StageComplete);
                    }
                }
                else
                {
                    DoLoop(~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached));
                }

                FinishLinkedInteraction(IsMaster);
                bool succeeded = !Rejected && !mPrivacyFailed;
                EndCommodityUpdates(succeeded);
                StandardExit(false, false);
                InvokeDoResumeOnCleanup = false;
                if (!mPrivacyFailed)
                {
                    Actor.SimDescription.SetFirstWooHoo();
                }

                if ((Rejected && !IsMaster) && Stand.Singleton.CreateInstance(mSauna, Actor, Actor.InheritedPriority(), false, false).RunInteraction())
                {
                    Actor.PlayReaction(ReactionTypes.Embarrassed, ReactionSpeed.AfterInteraction);
                }

                WaitForSyncComplete();
                return(!Rejected);
            }
            catch (ResetException)
            {
                throw;
            }
            catch (Exception e)
            {
                Common.Exception(Actor, Target, e);
                return(false);
            }
        }