Beispiel #1
0
        public bool Run(T ths, IMagicalDefinition definition)
        {
            MagicControl control = MagicControl.GetBestControl(ths.Actor, definition);

            if (control == null)
            {
                return(false);
            }

            mWand = control.InitialPrep(ths.Actor, definition, out mWandCreated);
            if (mWand == null)
            {
                return(false);
            }

            mWand.PrepareForUse(ths.Actor);

            ths.Wand = mWand;

            bool twoPerson = (ths.Actor == ths.Target);

            if (!Hybrid.Settings.mEnforceTwoPersonAnimation)
            {
                twoPerson = false;
            }

            bool spellCastingEpiclyFailed;
            bool spellCastingSucceeded = !IsFailure(ths.Actor, control, definition, out spellCastingEpiclyFailed);

            if (!EpicFailureAllowed(ths))
            {
                spellCastingEpiclyFailed = false;
            }

            if (!InitialPrep(ths, twoPerson, definition, control, spellCastingSucceeded, spellCastingEpiclyFailed))
            {
                return(false);
            }

            ths.StandardEntry();
            ths.BeginCommodityUpdates();

            if (!SetupAnimation(ths, control, twoPerson))
            {
                return(false);
            }

            control.ConsumeMana(ths.Actor, this, definition);

            if (!PerformResults(ths, "EpicFail", definition, control, spellCastingSucceeded, spellCastingEpiclyFailed))
            {
                mSucceeded = false;
            }

            EventTracker.SendEvent(EventTypeId.kCastSpell, ths.Actor);
            ths.EndCommodityUpdates(mSucceeded);
            ths.StandardExit();
            return(mSucceeded);
        }
Beispiel #2
0
        public override bool Run()
        {
            try
            {
                IMagicalDefinition definition = InteractionDefinition as IMagicalDefinition;

                bool succeeded = true;
                Actor.ClearExitReasons();
                if (mIsChallenger || (mChallengerSim == null))
                {
                    mIsChallenger  = true;
                    mChallengerSim = Actor;
                    mDefenderSim   = Target;
                    if (mDefenderSim == null)
                    {
                        return(false);
                    }

                    EventTracker.SendEvent(EventTypeId.kChallengeToSpellcasting, mChallengerSim, mDefenderSim);

                    mJig = GlobalFunctions.CreateObjectOutOfWorld("castSpellDuel_jig", ProductVersion.EP7) as SocialJigTwoPerson;
                    mJig.RegisterParticipants(mDefenderSim, mChallengerSim);
                    mJig.SetOpacity(0f, 0f);

                    Vector3 position      = mDefenderSim.Position;
                    Vector3 forwardVector = mDefenderSim.ForwardVector;
                    if (!GlobalFunctions.FindGoodLocationNearby(mJig, ref position, ref forwardVector))
                    {
                        return(false);
                    }

                    mJig.SetPosition(position);
                    mJig.SetForward(forwardVector);
                    mJig.AddToWorld();
                    if (!Actor.DoRoute(mJig.RouteToJigB(mChallengerSim)))
                    {
                        return(false);
                    }

                    mRouteComplete      = true;
                    mInteractionPersonB = SingletonPersonB.CreateInstance(mChallengerSim, mDefenderSim, new InteractionPriority(InteractionPriorityLevel.UserDirected), false, true) as MagicWand.SpellcastingDuel;
                    mInteractionPersonB.LinkedInteractionInstance = this;
                    mInteractionPersonB.mChallengerSim            = mChallengerSim;
                    mInteractionPersonB.Jig                 = mJig;
                    mInteractionPersonB.mDefenderSim        = mDefenderSim;
                    mInteractionPersonB.IsChallenger        = false;
                    mInteractionPersonB.CancellableByPlayer = false;
                    mDefenderSim.InteractionQueue.AddNext(mInteractionPersonB);
                    PresetDuelResults();
                }
                else
                {
                    if (!Actor.DoRoute(mJig.RouteToJigA(mDefenderSim)))
                    {
                        return(false);
                    }
                    mRouteComplete = true;
                }

                MagicControl controlX = MagicControl.GetBestControl(mChallengerSim, definition);
                if (controlX == null)
                {
                    return(false);
                }

                MagicControl controlY = MagicControl.GetBestControl(mDefenderSim, definition);
                if (controlY == null)
                {
                    return(false);
                }

                StandardEntry(true);
                BeginCommodityUpdates();
                if (mIsChallenger)
                {
                    while ((!mRouteComplete || !mInteractionPersonB.RouteComplete) && (mDefenderSim.InteractionQueue.HasInteraction(mInteractionPersonB) && !Actor.HasExitReason()))
                    {
                        SpeedTrap.Sleep(0x0);
                    }

                    if (mDefenderSim.HasExitReason() || mChallengerSim.HasExitReason())
                    {
                        mDefenderSim.AddExitReason(ExitReason.Canceled);
                        EndCommodityUpdates(false);
                        StandardExit();
                        return(false);
                    }

                    AcquireStateMachine("spellcastingDuel");

                    SetActor("x", mChallengerSim);
                    SetActor("y", mDefenderSim);

                    mWandX = controlX.InitialPrep(mChallengerSim, definition, out mWandXCreated);
                    mWandY = controlY.InitialPrep(mDefenderSim, definition, out mWandYCreated);
                    if ((mWandX == null) || (mWandY == null))
                    {
                        return(false);
                    }

                    mWandX.PrepareForUse(mChallengerSim);
                    if (mWandX is MagicHands)
                    {
                        SetParameter("noWandX", true);
                    }
                    else
                    {
                        SetParameter("noWandX", false);
                    }

                    mWandY.PrepareForUse(mDefenderSim);
                    if (mWandY is MagicHands)
                    {
                        SetParameter("noWandY", true);
                    }
                    else
                    {
                        SetParameter("noWandY", false);
                    }

                    SetActor("wandX", mWandX);
                    SetActor("wandY", mWandY);

                    SetParameter("x:Age", Actor.SimDescription.Age);
                    SetParameter("y:Age", Actor.SimDescription.Age);

                    EnterState("x", "Enter");
                    EnterState("y", "Enter");

                    AddPersistentScriptEventHandler(0x65, CastingEffect);
                    AddPersistentScriptEventHandler(0x66, BlockingEffect);
                    AddPersistentScriptEventHandler(0x67, HitEffect);
                    AddPersistentScriptEventHandler(0x68, BlockingEffectTwo);
                    ReturnToIdle();

                    for (int i = 0x0; i < mTotalRounds; i++)
                    {
                        mCurrResult = mRoundResults[i];
                        mCastType   = (CastingType)RandomUtil.GetInt(0x4);

                        switch (mCurrResult)
                        {
                        case RoundResult.ChallengerHit:
                            AnimateJoinSims("XHit");
                            break;

                        case RoundResult.ChallengerDefend:
                            AnimateJoinSims("XDef");
                            break;

                        case RoundResult.DefenderHit:
                            AnimateJoinSims("YHit");
                            break;

                        case RoundResult.DefenderDefend:
                            AnimateJoinSims("YDef");
                            break;
                        }

                        ReturnToIdle();
                    }

                    switch (mDuelResult)
                    {
                    case DuelResult.ChallengerWin:
                        AnimateJoinSims("XWin");
                        mChallengerSim.BuffManager.AddElement(BuffNames.WonASpellcastingDuel, Origin.FromSpellcastingDuel);
                        mDefenderSim.BuffManager.AddElement(BuffNames.LostASpellcastingDuel, Origin.FromSpellcastingDuel);
                        EventTracker.SendEvent(EventTypeId.kWonASpellcastingDuel, mChallengerSim);
                        break;

                    case DuelResult.DefenderWin:
                        AnimateJoinSims("YWin");
                        mDefenderSim.BuffManager.AddElement(BuffNames.WonASpellcastingDuel, Origin.FromSpellcastingDuel);
                        mChallengerSim.BuffManager.AddElement(BuffNames.LostASpellcastingDuel, Origin.FromSpellcastingDuel);
                        EventTracker.SendEvent(EventTypeId.kWonASpellcastingDuel, mDefenderSim);
                        break;

                    default:
                        AnimateJoinSims("Tie");
                        mChallengerSim.BuffManager.AddElement(BuffNames.DrawnASpellcastingDuel, Origin.FromSpellcastingDuel);
                        mDefenderSim.BuffManager.AddElement(BuffNames.DrawnASpellcastingDuel, Origin.FromSpellcastingDuel);
                        break;
                    }
                    mDefenderSim.AddExitReason(ExitReason.Finished);
                }
                else
                {
                    succeeded = DoLoop(~(ExitReason.Replan | ExitReason.MidRoutePushRequested | ExitReason.ObjectStateChanged | ExitReason.PlayIdle | ExitReason.MaxSkillPointsReached));
                }

                EndCommodityUpdates(succeeded);
                StandardExit(true);
                return(true);
            }
            catch (ResetException)
            {
                throw;
            }
            catch (Exception e)
            {
                Common.Exception(Actor, Target, e);
                return(false);
            }
        }