public static IEnumerator TestAutoGuideEmpty() { TestHarness.OnSOF(() => { TestHarness.RunBehaviorScript("Auto Empty Guide", "mokou"); var red = BM.TPool("gem-red/b"); var baseLoc = V2RV2.NRot(1, 0); TestHarness.Check(0, () => { var e = BM.TPool("empty.1"); AreEqual(4, red.Count); for (int ii = 0; ii < 4; ++ii) { var sloc = (baseLoc + V2RV2.RX(2, 45 + ii * 90)).Bank(); var eloc = (sloc + V2RV2.RX(0.2f, 32)).Bank() + V2RV2.RY(1f + frame); SBPos(ref e[ii], eloc.TrueLocation); //90 is the direction of the empty bullet (from rotate @ mydir over the movement py + 1 t) var rloc = eloc.BankOffset(90) + V2RV2.RX(1, 80); SBPos(ref red[ii], rloc.TrueLocation); } }); }); while (TestHarness.Running) { yield return(null); } }
public override void UpdateRender() { sprite.color = ColorHelpers.V4C(color(beh.rBPI)); lastRV2 = GetLocScaleRot(); tr.localPosition = lastRV2.NV; tr.localEulerAngles = new Vector3(0, 0, M.Mod(360, lastRV2.angle)); base.UpdateRender(); }
public static void TestV2RV2() { AreEqual(V2RV2.Zero, ParseV2RV2("<>")); AreEqual(V2RV2.Angle(2 * M.IPHI), ParseV2RV2("<2h>")); AreEqual(V2RV2.Rot(4.0f, -2.5f, 2 * M.IPHI), ParseV2RV2("<4.0;-2.5:2h>")); ThrowsAny(() => ParseV2RV2("<gf;-2.5:2h>")); AreEqual(new V2RV2(2f, 3f, 4.0f, -2.5f, 2 * M.IPHI), ParseV2RV2("<2;3:4.0;-2.5:2h>")); AreEqual(new V2RV2(2f, 3f, 0, 0, 2 * M.IPHI), ParseV2RV2("<2;3:;:2h>")); }
public static IEnumerator TestGTR2() { TestHarness.OnSOF(() => { TestHarness.RunBehaviorScript("GTR2", "mokou"); var red = BM.TPool("strip-red/w"); var blue = BM.TPool("strip-blue/w"); TestHarness.Check(0, () => { AreEqual(1, red.Count); SBPos(ref red[0], V2RV2.RX(1).TrueLocation); AreEqual(1, blue.Count); SBPos(ref blue[0], V2RV2.RX(1, 180).TrueLocation); }); TestHarness.Check(1, () => { AreEqual(2, red.Count); SBPos(ref red[1], V2RV2.RX(1, 10).TrueLocation); AreEqual(2, blue.Count); SBPos(ref blue[1], V2RV2.RX(1, 190).TrueLocation); }); TestHarness.Check(2, () => { AreEqual(2, red.Count); AreEqual(2, blue.Count); }); TestHarness.Check(3, () => { AreEqual(3, red.Count); SBPos(ref red[2], V2RV2.RX(1).TrueLocation); AreEqual(3, blue.Count); SBPos(ref blue[2], V2RV2.RX(1, 180).TrueLocation); }); TestHarness.Check(4, () => { AreEqual(4, red.Count); SBPos(ref red[3], V2RV2.RX(1, 10).TrueLocation); AreEqual(4, blue.Count); SBPos(ref blue[3], V2RV2.RX(1, 190).TrueLocation); }); TestHarness.Check(5, () => { AreEqual(4, red.Count); AreEqual(4, blue.Count); }); TestHarness.Check(6, () => { AreEqual(5, red.Count); SBPos(ref red[4], V2RV2.RX(1).TrueLocation); AreEqual(5, blue.Count); SBPos(ref blue[4], V2RV2.RX(1, 180).TrueLocation); }); TestHarness.Check(7, () => { AreEqual(6, red.Count); SBPos(ref red[5], V2RV2.RX(1, 10).TrueLocation); AreEqual(6, blue.Count); SBPos(ref blue[5], V2RV2.RX(1, 190).TrueLocation); }); }); while (TestHarness.Running) { yield return(null); } }
public static void TCartesianRotNRot() { var p = "roffset px * 2 t".Into <VTP>(); var bpi = new ParametricInfo(Vector2.down, 3, 0, 0f); Movement v = new Movement(p, Vector2.zero, V2RV2.Angle(25)); v.UpdateDeltaAssignAcc(ref bpi, out var _, 1f); VecEq(bpi.loc, V2RV2.Rot(2, 0, 25).TrueLocation, "", err1); p = "nroffset px * 2 t".Into <VTP>(); bpi = new ParametricInfo(Vector2.down, 3, 0, 0f); v = new Movement(p, Vector2.zero, V2RV2.Angle(25)); v.UpdateDeltaAssignAcc(ref bpi, out var _, 1f); VecEq(bpi.loc, V2RV2.NRot(2, 0).TrueLocation, "", err1); }
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(); }
public static IEnumerator TestSummonAlong() { TestHarness.OnSOF(() => { TestHarness.RunBehaviorScript("SummonAlong", "mokou"); var o = BM.TPool("gem-red/w"); var bo = BM.TPool("gem-green/w"); var br = BM.TPool("gem-blue/w"); var bt = BM.TPool("gem-teal/w"); var baseLocv2 = V2(1, 0); var baseLoc = V2RV2.NRot(1, 0); var oloc = baseLoc + V2RV2.RX(1, 80); var boloc = baseLoc + V2RV2.RX(1, 160); var brloc = baseLoc + V2RV2.RX(1, 240); var btloc = baseLoc + V2RV2.RX(1, 320); //Verify summons are correct SBPos(ref o[0], oloc + V2RV2.RY(0, 30)); SBPos(ref o[1], oloc + V2RV2.RY(1, 30)); SBPos(ref bo[0], boloc.Bank() + V2RV2.RY(0)); SBPos(ref bo[1], boloc.Bank() + V2RV2.RY(1)); SBPos(ref br[0], brloc.Bank() + V2RV2.RY(0)); SBPos(ref br[1], brloc.Bank() + V2RV2.RY(1)); SBPos(ref bt[0], btloc.Bank() + V2RV2.RY(0)); SBPos(ref bt[1], btloc.Bank() + V2RV2.RY(1)); TestHarness.Check(0, () => { //Verify angle is correct SBPos(ref o[0], oloc + V2RV2.Rot(frame, 0, 30)); SBPos(ref o[1], oloc + V2RV2.Rot(frame, 1, 30)); SBPos(ref bo[0], (boloc.Bank() + V2RV2.RY(0)).Bank() + V2RV2.RX(frame, 30)); SBPos(ref bo[1], (boloc.Bank() + V2RV2.RY(1)).Bank() + V2RV2.RX(frame, 30)); var rp = (brloc.Bank() + V2RV2.RY(0)).Bank(30); SBPos(ref br[0], rp + V2RV2.RX(frame, (rp.TrueLocation - baseLocv2).ToDeg())); rp = (brloc.Bank() + V2RV2.RY(1)).Bank(30); SBPos(ref br[1], rp + V2RV2.RX(frame, (rp.TrueLocation - baseLocv2).ToDeg())); //In this case the tangent is 90 degrees from the firing direction (summonalong eq = py t) SBPos(ref bt[0], (btloc.Bank() + V2RV2.RY(0)).BankOffset(30) + V2RV2.RX(frame, 90)); SBPos(ref bt[1], (btloc.Bank() + V2RV2.RY(1)).BankOffset(30) + V2RV2.RX(frame, 90)); }); }); while (TestHarness.Running) { yield return(null); } }
public static void TPolar() { var pivoter = "polar * 2 t * 60 t".Into <VTP>(); var pivoter2 = "polar2 pxy * 2 t * 60 t".Into <VTP>(); var bpi = new ParametricInfo(Vector2.zero, 1, 0, 0f); var bpi2 = new ParametricInfo(Vector2.zero, 1, 0, 0f); Movement v = new Movement(pivoter, Vector2.right, V2RV2.Angle(25)); Movement v2 = new Movement(pivoter2, Vector2.right, V2RV2.Angle(25)); v.UpdateDeltaAssignAcc(ref bpi, out var _, 1f); v2.UpdateDeltaAssignAcc(ref bpi2, out var _, 1f); VecEq(bpi.loc, V2(1, 0) + M.RotateVectorDeg(M.PolarToXY(2, 60), 25), "", err1); VecEq(bpi.loc, bpi2.loc); v = new Movement(pivoter, Vector2.left, V2RV2.NRotAngled(1, 1, 25)); v2 = new Movement(pivoter2, Vector2.left, V2RV2.NRotAngled(1, 1, 25)); v.UpdateDeltaAssignAcc(ref bpi, out var _, 1f); v2.UpdateDeltaAssignAcc(ref bpi2, out var _, 1f); VecEq(bpi.loc, V2(0, 1) + M.RotateVectorDeg(M.PolarToXY(4, 120), 25), "", err1); VecEq(bpi.loc, bpi2.loc); }
public static void TCartesian() { var pivoter = "offset px * 2 p py * 2 t".Into <VTP>(); var bpi = new ParametricInfo(Vector2.down, 3, 0, 0f); Movement v = new Movement(pivoter, Vector2.zero, V2RV2.Angle(25)); v.UpdateDeltaAssignAcc(ref bpi, out var _, 1f); VecEq(bpi.loc, new V2RV2(0, 2, 6, 0, 25).TrueLocation, "", err1); pivoter = "tp px * 2 p py * 2 t".Into <VTP>(); bpi = new ParametricInfo(Vector2.down, 3, 0, 0f); v = new Movement(pivoter, Vector2.zero, V2RV2.Angle(25)); v.UpdateDeltaAssignAcc(ref bpi, out var _, 2f); VecEq(bpi.loc, Vector2.down + new V2RV2(0, 4, 6, 0, 25).TrueLocation * 2f, "", err1); pivoter = "tp px * 2 p px * 2 t".Into <VTP>(); bpi = new ParametricInfo(Vector2.down, 3, 0, 0f); v = new Movement(pivoter, Vector2.zero, V2RV2.Angle(25)); v.FlipX(); v.UpdateDeltaAssignAcc(ref bpi, out var _, 2f); VecEq(bpi.loc, Vector2.down + new V2RV2(-4, 0, 6, 0, 180 - 25).TrueLocation * 2f, "", err1); }
public BankProp(bool toZero, V2RV2 f) { this.toZero = toZero; this.banker = _ => f; }
public static void SBPos(ref BulletManager.SimpleBullet sb, V2RV2 loc, string msg = "") => VecEq(loc.TrueLocation, sb.bpi.loc, msg);
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(); }
public static Func <TExArgCtx, TEx <V2RV2> > RV2(V2RV2 rv2) => bpi => ExC(rv2);