コード例 #1
0
 public static IEnumerator TestBank()
 {
     TestHarness.OnSOF(() => {
         var mokou = BehaviorEntity.GetExecForID("mokou");
         var red   = BM.TPool("strip-red/w");
         var green = BM.TPool("strip-green/w");
         var blue  = BM.TPool("strip-purple/w");
         TestHarness.RunBehaviorScript("Bank", "mokou");
         //Position command is dispatched synchronously, before frame 0
         VecEq(mokou.rBPI.loc, Vector2.zero, "Location is zero");
         //Sync bullet commands are also dispatched synchronously
         AreEqual(blue.Count, 2);
         VecEq(red[0].bpi.loc, 2 * Vector2.right);
         VecEq(red[1].bpi.loc, M.PolarToXY(2, 10));
         //Bank <1;:> off <1,:90>
         VecEq(green[0].bpi.loc, 2 * Vector2.up);
         VecEq(green[1].bpi.loc, Vector2.up + M.PolarToXY(1, 100));
         //Bank0 <1;:> off <1,:90>
         VecEq(blue[0].bpi.loc, new Vector2(1f, 1f));
         VecEq(blue[1].bpi.loc, Vector2.up + M.PolarToXY(1, 10));
     });
     while (TestHarness.Running)
     {
         yield return(null);
     }
 }
コード例 #2
0
 public TrackingContext(BehaviorEntity exec, ChallengeManager cm, Action <InstanceRecord> onSuccess)
 {
     this.exec      = exec;
     this.cm        = cm;
     this.onSuccess = onSuccess;
     this.t         = 0;
 }
コード例 #3
0
        public static IEnumerator TestPracticeSelector1()
        {
            bool cb = false;

            //Running Static Analysis 1
            new InstanceRequest(() => cb = true, FixedDfc(FixedDifficulty.Lunatic),
                                boss: new BossPracticeRequest(AllPBosses[0],
                                                              new SMAnalysis.Phase(null !, PhaseType.NONSPELL, 3, new LocalizedString("_")))).Run();
            IsFalse(cb);
            yield return(WaitForLoad());

            for (int ii = 0; ii < 10; ++ii)
            {
                yield return(null);
            }
            var m = BehaviorEntity.GetExecForID("mokou");

            AreEqual(0, PublicDataHoisting.GetF("v1", 1));
            AreEqual(0, PublicDataHoisting.GetF("v1", 2));
            //Go to third phase and then callback
            AreEqual(7, PublicDataHoisting.GetF("v1", 3));
            AreEqual(0, PublicDataHoisting.GetF("v1", 4));
            AreEqual(0, m.NumRunningSMs);
            IsFalse(cb);
            //2 second delay
            for (int ii = 0; ii < ETime.ENGINEFPS * InstanceRequest.WaitBeforeReturn; ++ii)
            {
                yield return(null);
            }
            IsTrue(cb);
            AreEqual("TestPractice", SceneManager.GetActiveScene().name);
        }
コード例 #4
0
        public static void LocalReset()
        {
            //AudioTrackService.ClearAllAudio();
            SFXService.ClearConstructed();
            Events.Event0.DestroyAll();
            ETime.Slowdown.RevokeAll(MultiOp.Priority.CLEAR_SCENE);
            ETime.Timer.DestroyAll();
            BehaviorEntity.DestroyAllSummons();
            PublicDataHoisting.DestroyAll();
            FiringCtx.ClearNames();
            ReflWrap.ClearWrappers();
            StateMachineManager.ClearCachedSMs();
            BulletManager.ClearPoolControls();
            BulletManager.ClearEmpty();
            BulletManager.ClearAllBullets();
            BulletManager.DestroyCopiedPools();
            InstanceData.CampaignDataUpdated.Proc();
#if UNITY_EDITOR || ALLOW_RELOAD
            Events.LocalReset.Proc();
#endif
            //Ordered last so cancellations from HardCancel will occur under old data
            Instance = new InstanceData(InstanceMode.NULL);
            Debug.Log($"Reloading level: {Difficulty.Describe()} is the current difficulty");
            UIManager.UpdateTags();
        }
コード例 #5
0
 public static IEnumerator TestBasicFiring()
 {
     TestHarness.OnSOF(() => {
         var mokou = BehaviorEntity.GetExecForID("mokou");
         var red   = BM.TPool("strip-red/w");
         var green = BM.TPool("strip-green/w");
         TestHarness.RunBehaviorScript("Regular Fire", "mokou");
         TAssert.VecEq(mokou.rBPI.loc, Vector2.zero, "Location is zero");
         TestHarness.Check(0, () => {
             //Bullet commands are dispatched during IEnum, which occurs sometime during frame 0
             Assert.AreEqual(red.Count, 2);
             TAssert.VecEq(red[0].bpi.loc, new Vector2(1, 0));
             TAssert.VecEq(red[1].bpi.loc, new Vector2(-1, 0));
             TAssert.PoolEq(red, green);
         });
         TestHarness.Check(4, () => {
             Assert.AreEqual(red.Count, 6);
             TAssert.VecEq(red[0].bpi.loc, M.PolarToXY(1 + 4f / 120, 0));
             TAssert.VecEq(red[2].bpi.loc, M.PolarToXY(1 + 2f / 120, 15));
             Assert.AreEqual(red[5].bpi.index, 2);
             TAssert.VecEq(red[5].bpi.loc, M.PolarToXY(1, 210));
             TAssert.PoolEq(red, green);
         });
     });
     while (TestHarness.Running)
     {
         yield return(null);
     }
 }
コード例 #6
0
        private static void CheckGCXPSequential()
        {
            var m   = BehaviorEntity.GetExecForID("mokou");
            var p11 = BM.TPool("sakura-pink/w");
            var p12 = BM.TPool("fireball-pink/w");
            var p21 = BM.TPool("sakura-red/w");
            var p22 = BM.TPool("fireball-red/w");

            TestHarness.Check(0, () => {
                VecEq(Vector2.zero, m.rBPI.loc);
                AreEqual(p11.Count, 1);
                AreEqual(p12.Count, 0);
            });
            TestHarness.Check(1, () => {
                AreEqual(p11.Count, 2);
                AreEqual(p12.Count, 1);
            });
            TestHarness.Check(2, () => {
                AreEqual(p11.Count, 2);
                AreEqual(p12.Count, 2);
            });
            //Note: This didn't use to work for GTR, because the first GTR iteration went like this:
            // - call child 1
            // - start waiter
            // > child 1 finishes, calls child 2
            // so the waiter ended up running after the child. This was fixed with RunTryPrepend for Async and Move commands.
            TestHarness.Check(4, () => {
                AreEqual(p11.Count, 3);
                AreEqual(p12.Count, 2);
            });
            TestHarness.Check(5, () => {
                AreEqual(p11.Count, 4);
                AreEqual(p12.Count, 3);
                AreEqual(p21.Count, 0);
            });
            TestHarness.Check(6, () => {
                AreEqual(p11.Count, 4);
                AreEqual(p12.Count, 4);
                AreEqual(p21.Count, 1);
                AreEqual(p22.Count, 0);
            });
            TestHarness.Check(7, () => {
                AreEqual(p21.Count, 2);
                AreEqual(p22.Count, 1);
            });
            TestHarness.Check(8, () => {
                AreEqual(p21.Count, 3);
                AreEqual(p22.Count, 2);
            });
            TestHarness.Check(9, () => {
                AreEqual(p21.Count, 4);
                AreEqual(p22.Count, 3);
            });
            TestHarness.Check(10, () => {
                AreEqual(p21.Count, 4);
                AreEqual(p22.Count, 4);
                VecEq(V2(2, 0), m.rBPI.loc);
            });
        }
コード例 #7
0
 public BottomTracker Initialize(BehaviorEntity beh, string sname, ICancellee canceller)
 {
     source = beh;
     source.TryAsEnemy(out enemy);
     text.text = sname;
     cT        = canceller;
     return(this);
 }
コード例 #8
0
 public override void ResetV(BehaviorEntity parent)
 {
     base.ResetV(parent);
     for (int ii = 0; ii < all.Length; ++ii)
     {
         all[ii].ResetV(parent);
     }
 }
コード例 #9
0
ファイル: BehaviorEntity.cs プロジェクト: Bagoum/danmokou
 public void Attach(BehaviorEntity new_beh)
 {
     if (found)
     {
         throw new Exception("Cannot attach BEHPointer twice");
     }
     beh   = new_beh;
     found = true;
 }
コード例 #10
0
 public void LinkBoss(BehaviorEntity exec)
 {
     if (tracking == null)
     {
         throw new Exception("Cannot link BEH when no challenge is tracked");
     }
     Log.Unity($"Linked boss {exec.ID} to challenge {tracking.Description}");
     tracking.Start(Exec = exec);
 }
コード例 #11
0
ファイル: Metadata.cs プロジェクト: Bagoum/danmokou
 public PhaseCompletion(PhaseProperties props, PhaseClearMethod clear, BehaviorEntity exec, CampaignSnapshot snap, float timeout)
 {
     this.props         = props;
     this.clear         = clear;
     this.exec          = exec;
     this.timeout       = timeout;
     this.hits          = GameManagement.Instance.HitsTaken - snap.hitsTaken;
     this.noMeter       = GameManagement.Instance.MeterFrames == snap.meterFrames;
     this.elapsedFrames = ETime.FrameNumber - snap.frame;
 }
コード例 #12
0
ファイル: BulletManager.cs プロジェクト: Bagoum/danmokou
 /// <summary>
 /// While most controls are bounded by ICancellee, some aren't, so they need to be destroyed.
 /// </summary>
 public static void ClearPoolControls(bool clearPlayer = true)
 {
     foreach (var pool in simpleBulletPools.Values)
     {
         if (clearPlayer || !pool.IsPlayer)
         {
             pool.ClearControls();
             pool.ResetPoolMetadata();
         }
     }
     BehaviorEntity.ClearPoolControls(clearPlayer);
     CurvedTileRenderLaser.ClearPoolControls(clearPlayer);
 }
コード例 #13
0
ファイル: BulletManager.cs プロジェクト: Bagoum/danmokou
 public static void OrphanAll()
 {
     ClearPoolControls();
     foreach (var pool in simpleBulletPools.Values)
     {
         pool.Reset();
         pool.Deactivate();
     }
     DestroyCopiedPools();
     activeNpc.Clear();
     activePlayer.Clear();
     Bullet.OrphanAll();
     BehaviorEntity.DeInitializePools();
     CurvedTileRenderLaser.DeInitializePools();
 }
コード例 #14
0
 public static void ClearForScene()
 {
     AudioTrackService.ClearAllAudio(false);
     SFXService.ClearConstructed();
     BulletManager.ClearPoolControls();
     Events.Event0.DestroyAll();
     ETime.Slowdown.RevokeAll(MultiOp.Priority.CLEAR_SCENE);
     ETime.Timer.DestroyAll();
     BulletManager.OrphanAll();
     PublicDataHoisting.DestroyAll();
     FiringCtx.ClearNames();
     //SMs may have links to data hoisting, so we destroy both of them on phase end.
     ReflWrap.ClearWrappers();
     StateMachineManager.ClearCachedSMs();
     BehaviorEntity.ClearPointers();
     AyaPhoto.ClearTextures();
 }
コード例 #15
0
        /// <summary>
        /// Task style-- will throw if cancelled. This checks cT.IsCancelled before returning,
        /// so you do not need to check it after awaiting this.
        /// </summary>
        /// <returns></returns>
        public static async Task WaitFor(BehaviorEntity Exec, ICancellee cT, float time, bool zeroToInfinity)
        {
            cT.ThrowIfCancelled();
            if (zeroToInfinity && time < float.Epsilon)
            {
                time = float.MaxValue;
            }
            if (time < float.Epsilon)
            {
                return;
            }
            Exec.RunRIEnumerator(WaitFor(time, cT, GetAwaiter(out Task t)));
            await t;

            //I do want this throw here, which is why I don't 'return t'
            cT.ThrowIfCancelled();
        }
コード例 #16
0
 public static IEnumerator TestGTR3()
 {
     TestHarness.OnSOF(() => {
         TestHarness.RunBehaviorScript("GTR3", "mokou");
         var m = BehaviorEntity.GetExecForID("mokou");
         TestHarness.Check(0, () => VecEq(V2(0, 1), m.rBPI.loc));
         TestHarness.Check(1, () => VecEq(V2(0, 1), m.rBPI.loc));
         TestHarness.Check(2, () => VecEq(V2(1, 1), m.rBPI.loc));
         TestHarness.Check(3, () => VecEq(V2(1, 1), m.rBPI.loc));
         TestHarness.Check(4, () => VecEq(V2(2, 1), m.rBPI.loc));
         TestHarness.Check(5, () => VecEq(V2(2, 1), m.rBPI.loc));
         TestHarness.Check(6, () => VecEq(V2(2, 1), m.rBPI.loc));
     });
     while (TestHarness.Running)
     {
         yield return(null);
     }
 }
コード例 #17
0
        public override Task Start(SMHandoff smh)
        {
            var behs = BehaviorEntity.GetExecsForIDs(targets);

            if (behs.Length == 0)
            {
                Log.Unity($"Retarget operation with targets {string.Join(", ", targets)} found no BEH", level: Log.Level.WARNING);
                return(Task.CompletedTask);
            }
            else if (behs.Length == 1)
            {
                return(behs[0].RunExternalSM(SMRunner.Run(states[0], smh.cT, smh.GCX), false));
            }
            else
            {
                return(Task.WhenAll(behs.Select(x => x.RunExternalSM(SMRunner.Run(states[0], smh.cT, smh.GCX), false))));
            }
        }
コード例 #18
0
        private IEnumerator RunTutorial(Action cb)
        {
            IEnumerator wait(Func <bool> cond)
            {
                while (!cond())
                {
                    yield return(null);
                }
            }

            IEnumerator confirm()
            {
                yield return(null);

                yield return(wait(() => UIConfirm.Active && !EngineStateManager.IsPaused));
            }

            DependencyInjection.Find <IUIManager>()
            .SetSpellname("Reduced Tutorial (For Players Too Smart for the Normal Tutorial)");

            var mov = new Movement(new Vector2(-2, 2.5f), 0);

            BulletManager.RequestSimple("lcircle-red/", _ => 4f, null, mov, new ParametricInfo(in mov));
            var nrx = new RealizedLaserOptions(new LaserOptions(), GenCtx.New(this, V2RV2.Zero), FiringCtx.New(), new Vector2(3, 5),
                                               V2RV2.Angle(-90), Cancellable.Null);

            "sync _ <> relrect greenrect level <-2;2.5:1.4;1.4:0> witha 0.7 green".Into <StateMachine>()
            .Start(new SMHandoff(this, Cancellable.Null));
            Message(text10, mtcirc1(UIConfirm.Desc));
            yield return(confirm());

            BulletManager.ClearAllBullets();
            BehaviorEntity.GetExecForID("greenrect").InvokeCull();
            mov = new Movement(new Vector2(-3, 5), -90);
            BulletManager.RequestLaser(null, "mulaser-blue/b", mov, new ParametricInfo(in mov), 999, 0,
                                       ref nrx);
            mov = new Movement(new Vector2(-2, 5), -90);
            BulletManager.RequestLaser(null, "zonelaser-green/b", mov, new ParametricInfo(in mov), 999, 0,
                                       ref nrx);
            Message(text10, mtsafe2(UIConfirm.Desc));
            yield return(confirm());

            cb();
        }
コード例 #19
0
 public static IEnumerator TestGIR1()
 {
     TestHarness.OnSOF(() => {
         TestHarness.RunBehaviorScript("IRepeat1", "mokou");
         var red   = BM.TPool("strip-red/w");
         var green = BM.TPool("strip-green/w");
         var mokou = BehaviorEntity.GetExecForID("mokou");
         TestHarness.Check(0, () => {
             AreEqual(1, red.Count);
             AreEqual(1, green.Count);
             AreEqual(5, mokou.NumRunningCoroutines); //1 for phase timeout, 2 for each irepeat
         });
         TestHarness.Check(1, () => {
             AreEqual(2, red.Count);
             AreEqual(3, green.Count);
             SBPos(ref red[1], V2(-1, 0));
             SBPos(ref green[1], V2(-1, 0));
             SBPos(ref green[2], V2(0, 1));
             AreEqual(3, mokou.NumRunningCoroutines); //phase, red GIR waiting, final green GCR (GIR hoists itself into a callback for last GCR)
         });
         TestHarness.Check(2, () => {
             AreEqual(3, red.Count);
             AreEqual(4, green.Count);
             SBPos(ref red[2], V2(0, 1));
             SBPos(ref green[3], V2(0, -1));
             AreEqual(2, mokou.NumRunningCoroutines); //phase, final red GCR
         });
         TestHarness.Check(3, () => {
             AreEqual(4, red.Count);
             AreEqual(4, green.Count);
             SBPos(ref red[3], V2(0, -1));
             AreEqual(1, mokou.NumRunningCoroutines); //The phase timeout coroutine is zombieing, but that's fine
             AreEqual(0, mokou.NumRunningSMs);
         });
         TestHarness.Check(4, () => {
             AreEqual(0, mokou.NumRunningCoroutines);
         });
     });
     while (TestHarness.Running)
     {
         yield return(null);
     }
 }
コード例 #20
0
 public static IEnumerator TestStaticAnalysis1_1()
 {
     TestHarness.OnSOF(() => {
         var m = BehaviorEntity.GetExecForID("mokou");
         TestHarness.RunBehaviorScript("Static Analysis 1", "mokou");
         //Case 1: setup goes to phase 2, which goes to 3 and then 4.
         TestHarness.Check(2, () => {
             AreEqual(0, PublicDataHoisting.GetF("v1", 1));
             AreEqual(6, PublicDataHoisting.GetF("v1", 2));
             AreEqual(7, PublicDataHoisting.GetF("v1", 3));
             AreEqual(8, PublicDataHoisting.GetF("v1", 4));
             AreEqual(0, m.NumRunningSMs);
         });
     });
     while (TestHarness.Running)
     {
         yield return(null);
     }
 }
コード例 #21
0
 public static IEnumerator TestStaticAnalysis1_3()
 {
     TestHarness.OnSOF(() => {
         var m = BehaviorEntity.GetExecForID("mokou");
         m.phaseController.Override(3, null, false);
         TestHarness.RunBehaviorScript("Static Analysis 1", "mokou");
         //Case 3: setup is overriden, phase 3 is run; without a callback, goes to phase 4.
         TestHarness.Check(2, () => {
             AreEqual(0, PublicDataHoisting.GetF("v1", 1));
             AreEqual(0, PublicDataHoisting.GetF("v1", 2));
             AreEqual(7, PublicDataHoisting.GetF("v1", 3));
             AreEqual(8, PublicDataHoisting.GetF("v1", 4));
             AreEqual(0, m.NumRunningSMs);
         });
     });
     while (TestHarness.Running)
     {
         yield return(null);
     }
 }
コード例 #22
0
 public static IEnumerator TestGTR1()
 {
     TestHarness.OnSOF(() => {
         TestHarness.RunBehaviorScript("GTR1", "mokou");
         var red   = BM.TPool("strip-red/w");
         var mokou = BehaviorEntity.GetExecForID("mokou");
         TestHarness.Check(0, () => {
             VecEq(mokou.rBPI.loc, V2(1, 0));
             AreEqual(1, red.Count);
         });
         TestHarness.Check(1, () => {
             VecEq(mokou.rBPI.loc, V2(1, 0));
             AreEqual(2, red.Count);
         });
         TestHarness.Check(2, () => { //gtr wait frame
             VecEq(mokou.rBPI.loc, V2(1, 0));
             AreEqual(2, red.Count);
         });
         TestHarness.Check(3, () => {
             VecEq(mokou.rBPI.loc, V2(2, 0));
             AreEqual(3, red.Count);
         });
         TestHarness.Check(4, () => {
             VecEq(mokou.rBPI.loc, V2(2, 0));
             AreEqual(4, red.Count);
         });
         TestHarness.Check(5, () => {
             VecEq(mokou.rBPI.loc, V2(2, 0));
             AreEqual(5, red.Count);
         });
         TestHarness.Check(6, () => {
             VecEq(mokou.rBPI.loc, V2(2, 0));
             AreEqual(5, red.Count);
         });
     });
     while (TestHarness.Running)
     {
         yield return(null);
     }
 }
コード例 #23
0
 public static IEnumerator TestCancel()
 {
     TestHarness.OnSOF(() => {
         TestHarness.RunBehaviorScript("Cancel", "mokou");
         var mokou  = BehaviorEntity.GetExecForID("mokou");
         var red    = BM.TPool("gem-red/w");
         var green  = BM.TPool("gem-green/w");
         var blue   = BM.TPool("gem-blue/w");
         var orange = BM.TPool("gem-orange/w");
         var rc     = 0;
         TestHarness.Check(0, () => {
             AreEqual(1, red.Count);
             AreEqual(1, green.Count);
             AreEqual(0, blue.Count);
             AreEqual(4, orange.Count);
             rc = mokou.NumRunningCoroutines;
         });
         TestHarness.Check(1, () => {
             AreEqual(2, red.Count);
             AreEqual(1, green.Count);
             AreEqual(0, blue.Count);
             AreEqual(4, orange.Count);
             // Only green is finished. red and blue will finish in next preloop
             AreEqual(rc - 1, mokou.NumRunningCoroutines);
         });
         TestHarness.Check(2, () => {
             AreEqual(2, red.Count);
             AreEqual(1, green.Count);
             AreEqual(0, blue.Count);
             AreEqual(1, mokou.NumRunningCoroutines); //The phase timeout coroutine is zombieing, but that's fine
             AreEqual(0, mokou.NumRunningSMs);
         });
     });
     while (TestHarness.Running)
     {
         yield return(null);
     }
 }
コード例 #24
0
 public static IEnumerator TestStaticAnalysis1_2()
 {
     TestHarness.OnSOF(() => {
         var m   = BehaviorEntity.GetExecForID("mokou");
         bool cb = false;
         m.phaseController.Override(3, () => cb = true, false);
         TestHarness.RunBehaviorScript("Static Analysis 1", "mokou");
         //Case 2: setup is overriden, phase 3 is run.
         TestHarness.Check(0, () => IsTrue(!cb));
         TestHarness.Check(2, () => {
             AreEqual(0, PublicDataHoisting.GetF("v1", 1));
             AreEqual(0, PublicDataHoisting.GetF("v1", 2));
             AreEqual(7, PublicDataHoisting.GetF("v1", 3));
             AreEqual(0, PublicDataHoisting.GetF("v1", 4));
             IsTrue(cb);
             AreEqual(0, m.NumRunningSMs);
         });
     });
     while (TestHarness.Running)
     {
         yield return(null);
     }
 }
コード例 #25
0
ファイル: Challenges.cs プロジェクト: Bagoum/danmokou
 public void Start(BehaviorEntity exec)
 {
     exec.phaseController.Override(cr.phase.phase.index, () => { });
     exec.RunSMFromScript(cr.Boss.stateMachine);
 }
コード例 #26
0
 public static void ClearPhaseAutocull(SoftcullProperties props)
 {
     ClearPhase();
     BulletManager.Autocull(props);
     BehaviorEntity.Autocull(props);
 }
コード例 #27
0
 public override void ResetV(BehaviorEntity parent)
 {
     base.ResetV(parent);
     animate.Initialize(SetSprite, SetFlip);
 }
コード例 #28
0
        private IEnumerator RunTutorial(int skips)
        {
            while (SceneIntermediary.LOADING)
            {
                yield return(null);
            }
            bool canSkip() => skips-- > 0;

            IEnumerator wait(Func <bool> cond)
            {
                if (!canSkip())
                {
                    while (!cond())
                    {
                        yield return(null);
                    }
                }
            }

            IEnumerator waitlf(Func <bool> cond) => wait(() => ETime.FirstUpdateForScreen && cond());

            IEnumerator waiti(IInputHandler ih)
            {
                yield return(null);

                yield return(waitlf(() => ih.Active));
            }

            IEnumerator waitir(IInputHandler ih)
            {
                yield return(null);

                yield return(waitlf(() => !ih.Active));
            }

            IEnumerator confirm() => waiti(UIConfirm);

            DependencyInjection.Find <IUIManager>().SetSpellname("Tutorial");
            Message(text10, welcome1(UIConfirm.Desc));
            yield return(confirm());

            Prompt(text10, blue2(Pause.Desc));
            yield return(waitlf(() => EngineStateManager.IsPaused));

            UIManager.PauseMenu !.GoToOption(0);
            const float menuLeft = -4.8f;

            Message(text00, pause3, x: menuLeft);
            yield return(confirm());

            Message(text00, shaders4, x: menuLeft);
            yield return(confirm());

            Prompt(text00, shaders5, 1.2f, x: menuLeft);
            var sd = SaveData.s.Shaders;

            yield return(waitlf(() => SaveData.s.Shaders != sd));

            Prompt(text00, res6, 0.85f, x: menuLeft);
            var r = SaveData.s.Resolution;

            yield return(waitlf(() => SaveData.s.Resolution != r));

            Message(text00, refresh7, 0.5f, x: menuLeft);
            yield return(confirm());

            Message(text00, fullscreen8, 0.15f, x: menuLeft);
            yield return(confirm());

            Message(text00, vsync9, -0.25f, x: menuLeft);
            yield return(confirm());

            Message(text00, inputsmooth10, -0.7f, x: menuLeft);
            yield return(confirm());

            Prompt(text00, unpause11(Pause.Desc), x: menuLeft);
            yield return(waitlf(() => !EngineStateManager.IsLoadingOrPaused));

            var mov = new Movement(new Vector2(-2, 2.5f), 0);

            BulletManager.RequestSimple("lcircle-red/", _ => 4f, null, mov, new ParametricInfo(in mov));
            var nrx = new RealizedLaserOptions(new LaserOptions(), GenCtx.New(this, V2RV2.Zero), FiringCtx.New(), new Vector2(3, 5),
                                               V2RV2.Angle(-90), Cancellable.Null);

            mov = new Movement(new Vector2(2, 5), -90);
            BulletManager.RequestLaser(null, "mulaser-blue/b", mov, new ParametricInfo(in mov), 999, 0, ref nrx);
            mov = new Movement(new Vector2(3, 5), -90);
            BulletManager.RequestLaser(null, "zonelaser-green/b", mov, new ParametricInfo(in mov), 999, 0,
                                       ref nrx);
            "sync _ <> relrect greenrect level <-2;2.5:1.4;1.4:0> witha 0.7 green".Into <StateMachine>()
            .Start(new SMHandoff(this));
            Message(text10, redcircle12);
            yield return(confirm());

            Message(text10, legacy13);
            yield return(confirm());

            Message(text10, safelaser14);
            yield return(confirm());

            BulletManager.ClearAllBullets();
            BehaviorEntity.GetExecForID("greenrect").InvokeCull();

            Prompt(text10, fire15(ShootHold.Desc));
            yield return(waitir(ShootHold));

            yield return(waiti(ShootHold));

            Prompt(text10, move16);
            yield return(waitlf(() => Math.Abs(HorizontalSpeed01) > 0.1 || Math.Abs(VerticalSpeed01) > 0.1));

            Prompt(text10, focus17(FocusHold.Desc));
            yield return(waiti(FocusHold));

            var bcs  = new Cancellable();
            var boss = GameObject.Instantiate(tutorialBoss).GetComponent <BehaviorEntity>();

            boss.Initialize(SMRunner.CullRoot(StateMachine.CreateFromDump(bossSM.text), bcs));
            IEnumerator phase()
            {
                while (boss.PhaseShifter == null)
                {
                    yield return(null);
                }
                var pct = boss.PhaseShifter;

                if (canSkip())
                {
                    boss.ShiftPhase();
                }
                else
                {
                    yield return(wait(() => pct.Cancelled));
                }
                for (int ii = 0; ii < 244; ++ii)
                {
                    yield return(null); //phase delay

                    if (EngineStateManager.IsRunning)
                    {
                        ++ii;
                    }
                }
            }

            IEnumerator shift()
            {
                boss.ShiftPhase();
                for (int ii = 0; ii < 4; ++ii)
                {
                    yield return(null);                       //phase delay
                }
            }

            for (int ii = 0; ii < 8; ++ii)
            {
                yield return(null);                       //start delay
            }
            Message(text10, boss18);
            yield return(confirm());

            Message(text10, hpbar19);
            yield return(confirm());

            yield return(shift());

            Prompt(text10, ns20);
            yield return(phase());

            Prompt(text10, nss21);
            yield return(phase());

            Prompt(text10, spell22);
            yield return(phase());

            Prompt(text10, survival23);
            yield return(phase());

            Message(text10, items24);
            yield return(confirm());

            Message(text10, bullets25);
            yield return(confirm());

            yield return(shift());

            Prompt(text10, shoot26);
            yield return(phase());

            Message(text10, lives27, 0.3f);
            yield return(confirm());

            Instance.SetLives(10);
            Message(text10, dots28);
            yield return(confirm());

            Instance.SetLives(15);
            Message(text10, dots29);
            yield return(confirm());

            Instance.SetLives(1);
            Message(text10, dots30);
            yield return(confirm());

            Message(text10, nobombs31);
            yield return(confirm());

            yield return(shift());

            Prompt(text10, pleasedie32);
            yield return(waitlf(() => EngineStateManager.IsDeath));

            Prompt(text00, deathscreen33, x: menuLeft);
            yield return(waitlf(() => !EngineStateManager.IsDeath));

            yield return(shift());

            Message(text10, lifeitems34, -0.3f);
            yield return(confirm());

            yield return(shift());

            Prompt(text10, lifeitems35);
            int currLives = Instance.Lives;

            yield return(waitlf(() => Instance.Lives > currLives));

            yield return(shift());

            Message(text10, valueitems36(InstanceData.valueItemPoints));
            yield return(confirm());

            yield return(shift());

            Prompt(text10, points37);
            yield return(waitlf(() => Instance.Score > 75000));

            yield return(shift());

            Message(text00, scoremult38);
            yield return(confirm());

            Message(text00, faith39(InstanceData.pivFallStep));
            yield return(confirm());

            Message(text00, faithblue40);
            yield return(confirm());

            Message(text10, graze41);
            yield return(confirm());

            yield return(shift());

            Prompt(text10, scoremult42);
            yield return(waitlf(() => Instance.PIV >= 1.11));

            yield return(shift());

            yield return(waitlf(() => Instance.PIV <= 1.0));

            Message(text10, scoreext43);
            yield return(confirm());

            yield return(shift());

            Prompt(text10, scoreext44);
            yield return(waitlf(() => Instance.Score > 2000000));

            yield return(shift());

            Message(text10, ability45);
            yield return(confirm());

            yield return(shift());

            Prompt(text10, ability46(Meter.Desc));
            GameManagement.Instance.AddGems(100);
            yield return(waitlf(() => InputManager.IsMeter));

            yield return(shift());

            Message(text10, ability47);
            yield return(confirm());

            Message(text10, meter48);
            yield return(confirm());

            yield return(shift());

            Message(text10, hitbox49);
            yield return(confirm());

            yield return(shift());

            Message(text10, hitbox50);
            yield return(confirm());

            yield return(shift());

            Message(text10, safelaser51);
            yield return(confirm());

            yield return(shift());

            Prompt(text10, end52);
            SaveData.r.CompleteTutorial();
        }
コード例 #29
0
 protected virtual void Awake()
 {
     beh = GetComponent <BehaviorEntity>();
 }
コード例 #30
0
 public void Trigger(BehaviorEntity Exec, GenCtx gcx, ICancellee cT)
 {
     _ = Exec.GetINode("finish-triggered", null).RunExternalSM(SMRunner.Cull(this.states[0], cT, gcx));
 }