Ejemplo n.º 1
0
        public bool BaseRunEx()
        {
            mRelationship = Relationship.Get(Actor, Target, true);
            if (mRelationship == null)
            {
                return(false);
            }
            bool flag = false;

            if (IsSlowDance)
            {
                string reason;
                GreyedOutTooltipCallback greyedOutTooltipCallback = null;
                if (CommonSocials.CanGetRomantic(Actor, Target, false, false, true, ref greyedOutTooltipCallback, out reason))
                {
                    flag = true;
                }
            }
            else
            {
                foreach (CommodityTypes types in kAcceptableCommodities)
                {
                    if (mRelationship.STC.CurrentCommodity == types)
                    {
                        flag = true;
                        break;
                    }
                }
            }

            Definition interactionDefinition = InteractionDefinition as Definition;
            IDanceable danceObject           = interactionDefinition.DanceObject;

            if (flag)
            {
                mDanceFloor = DanceFloor.FindAndRouteOntoADanceFloorWithFollower(Actor, Target, danceObject);
                if (mDanceFloor != null)
                {
                    mDanceFloor.AddToUseList(Actor);
                    if (!mDanceFloor.IsActorUsingMe(Target))
                    {
                        mDanceFloor.AddToUseList(Target);
                    }
                }
            }

            Stereo targetStereo = interactionDefinition.TargetStereo;

            if (targetStereo != null)
            {
                targetStereo.AddSimListener(Actor);
                targetStereo.AddSimListener(Target);
            }

            string         instanceName = "SocialJigTwoPerson";
            ProductVersion baseGame     = ProductVersion.BaseGame;

            if (IsSlowDance)
            {
                instanceName = "SlowdanceJig";
                baseGame     = ProductVersion.EP8;
            }

            SocialJig = GlobalFunctions.CreateObjectOutOfWorld(instanceName, baseGame) as SocialJigTwoPerson;
            bool succeeded = false;

            Actor.SynchronizationLevel  = Sim.SyncLevel.NotStarted;
            Target.SynchronizationLevel = Sim.SyncLevel.NotStarted;
            string name = (Stereo.PartySimIsGettingMusicFromPartyLocation(Actor, danceObject) || Stereo.PartySimIsGettingMusicFromPartyLocation(Target, danceObject)) ? LocalizeString("BeRockingDancingTogether", new object[0x0]) : LocalizeString("BeDancingTogether", new object[0x0]);

            if (BeginSocialInteraction(new SocialInteractionB.Definition(null, name, false), true, false))
            {
                IGlass objectInRightHand = Actor.GetObjectInRightHand() as IGlass;
                if (objectInRightHand != null)
                {
                    objectInRightHand.PutGlassAway();
                }
                objectInRightHand = Target.GetObjectInRightHand() as IGlass;
                if (objectInRightHand != null)
                {
                    objectInRightHand.PutGlassAway();
                }

                string             stateMachineName = IsSlowDance ? "slowdance_together" : "dance_together";
                StateMachineClient smc = StateMachineClient.Acquire(Actor, stateMachineName);
                if (IsSlowDance)
                {
                    smc.SetActor("x", Actor);
                    smc.SetActor("y", Target);
                }
                else
                {
                    smc.SetActor("x", Target);
                    smc.SetActor("y", Actor);
                }
                smc.EnterState("x", "enter");
                smc.EnterState("y", "enter");
                if (GameUtils.IsInstalled(ProductVersion.EP7))
                {
                    smc.SetParameter("xIsProper", Target.HasTrait(TraitNames.Proper));
                    smc.SetParameter("yIsProper", Actor.HasTrait(TraitNames.Proper));
                }
                BeginCommodityUpdates();
                smc.RequestState(false, "x", "Ask_To_Dance");
                smc.RequestState(true, "y", "Ask_To_Dance");
                if (flag)
                {
                    smc.RequestState(false, "x", "Last_Sync");
                    smc.RequestState(true, "y", "Last_Sync");
                    smc.RequestState(false, "x", "dance");
                    smc.RequestState(true, "y", "dance");
                    Actor.SkillManager.StartGainAndAddSkillIfNeeded(SkillNames.Dancing, Stereo.kRateOfSkillGainForDancing);
                    Target.SkillManager.StartGainAndAddSkillIfNeeded(SkillNames.Dancing, Stereo.kRateOfSkillGainForDancing);
                    if (IsSlowDance)
                    {
                        EventTracker.SendEvent(EventTypeId.kSlowDanced, Actor, Target);
                        EventTracker.SendEvent(EventTypeId.kSlowDanced, Target, Actor);
                    }
                    succeeded = DoLoop(~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached), new InteractionInstance.InsideLoopFunction(DanceTogetherDelegate), smc);
                    Actor.SkillManager.StopSkillGain(SkillNames.Dancing);
                    Target.SkillManager.StopSkillGain(SkillNames.Dancing);
                    smc.RequestState(false, "x", "friendly");
                    smc.RequestState(true, "y", "friendly");
                }
                else
                {
                    smc.RequestState(false, "x", "awkward");
                    smc.RequestState(true, "y", "awkward");
                    mRelationship.LTR.UpdateLiking(Stereo.kLtrDecreaseAfterRejectingDanceTogether);
                    succeeded = false;
                }
            }

            Definition definition2 = InteractionDefinition as Definition;

            if ((definition2 != null) && (definition2.DanceObject is DJTurntable))
            {
                EventTracker.SendEvent(EventTypeId.kDanceToDJMusic, Target);
                EventTracker.SendEvent(EventTypeId.kDanceToDJMusic, Actor);
            }

            EndCommodityUpdates(succeeded);
            Actor.ClearSynchronizationData();
            return(succeeded);
        }
Ejemplo n.º 2
0
            public override void AddInteractions(InteractionObjectPair iop, Sim actor, Sim target, List <InteractionObjectPair> results)
            {
                try
                {
                    mTargetDanceObject = null;

                    foreach (InteractionObjectPair pair in actor.Interactions)
                    {
                        if (pair.InteractionDefinition.GetType() == typeof(Stereo.DanceTogetherA.Definition))
                        {
                            Stereo.DanceTogetherA.Definition definition = pair.InteractionDefinition as Stereo.DanceTogetherA.Definition;
                            mTargetDanceObject = definition.mTargetDanceObject;
                            break;
                        }
                    }

                    if (mTargetDanceObject == null)
                    {
                        return;
                    }

                    bool allowDance     = mTargetDanceObject.AllowsDance && (Stereo.SimCanBaseDance(actor, mTargetDanceObject) && Stereo.SimCanBaseDance(target, mTargetDanceObject));
                    bool allowClubDance = mTargetDanceObject.AllowsClubDance && (Stereo.SimCanClubDance(actor, mTargetDanceObject) && Stereo.SimCanClubDance(target, mTargetDanceObject));
                    bool canSlowDance   = Stereo.SimsCanSlowDanceTogether(actor, target, mTargetDanceObject);
                    int  num            = 0x0;
                    num += allowDance ? 0x1 : 0x0;
                    num += allowClubDance ? 0x1 : 0x0;
                    num += canSlowDance ? 0x1 : 0x0;
                    bool     inClub       = Stereo.ObjectIsInDanceClub(target);
                    string[] menu         = (num > 0x1) ? new string[] { Stereo.DanceTogetherA.LocalizeString("DanceMenu", new object[0x0]) } : new string[0x0];
                    bool     canClubDance = allowClubDance && inClub;
                    Stereo.DanceTogetherA.DanceType dance = Stereo.DanceTogetherA.DanceType.Dance;
                    if (allowDance || canClubDance)
                    {
                        if (canClubDance)
                        {
                            dance = Stereo.DanceTogetherA.DanceType.Club;
                        }

                        if (Stereo.PartySimIsGettingMusicFromPartyLocation(actor, mTargetDanceObject))
                        {
                            results.Add(new InteractionObjectPair(new Definition(Stereo.DanceTogetherA.LocalizeString("RockingInteractionName", new object[0x0]), menu, dance, mTargetDanceObject), iop.Target));
                        }
                        else
                        {
                            results.Add(new InteractionObjectPair(new Definition(Stereo.DanceTogetherA.LocalizeString("InteractionName", new object[0x0]), menu, dance, mTargetDanceObject), iop.Target));
                        }
                    }

                    if (allowClubDance && !canClubDance)
                    {
                        if (Stereo.PartySimIsGettingMusicFromPartyLocation(actor, mTargetDanceObject))
                        {
                            results.Add(new InteractionObjectPair(new Definition(Stereo.DanceTogetherA.LocalizeString("ClubRockingInteractionName", new object[0x0]), menu, Stereo.DanceTogetherA.DanceType.Club, mTargetDanceObject), iop.Target));
                        }
                        else
                        {
                            results.Add(new InteractionObjectPair(new Definition(Stereo.DanceTogetherA.LocalizeString("ClubDanceTogetherA", new object[0x0]), menu, Stereo.DanceTogetherA.DanceType.Club, mTargetDanceObject), iop.Target));
                        }
                    }

                    if (canSlowDance)
                    {
                        results.Add(new InteractionObjectPair(new Definition(Stereo.DanceTogetherA.LocalizeString("SlowDance", new object[0x0]), menu, Stereo.DanceTogetherA.DanceType.Slow, mTargetDanceObject), iop.Target));
                    }
                }
                catch (Exception e)
                {
                    Common.Exception(actor, target, e);
                }
            }