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); }
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); } }